Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 19, 2011 11:58:56

DRV
От:
Зарегистрирован: 2011-04-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

При пересечении полигонов получается ужасная картинка, плоскости пересекаются не по прямой линии, как должно быть, а по какой-то ломаной, что сильно портит весь вид. Как исправить?

Картинка
http://drv06.narod.ru/scr1.PNG



Отредактировано (Апрель 19, 2011 11:59:07)

Офлайн

#2 Апрель 19, 2011 19:10:27

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Пересечение полигонов в OpenGl

Вершин в геометрию добавить



Офлайн

#3 Апрель 19, 2011 23:54:47

DRV
От:
Зарегистрирован: 2011-04-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

Андрей Светлов
Вершин в геометрию добавить
Извините, но это не решение проблемы..

Есть у кого-нибудь конструктивные предложения? Кто знает, как сделать?



Офлайн

#4 Апрель 20, 2011 00:56:47

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

DRV, ну не знаю. либо у вас отключен буфер глубины, либо вы по несколько раз одно и то же тело рисуете.



Офлайн

#5 Апрель 20, 2011 18:32:26

DRV
От:
Зарегистрирован: 2011-04-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

regall
DRV, ну не знаю. либо у вас отключен буфер глубины, либо вы по несколько раз одно и то же тело рисуете.
Конечно же буфер глубины включён. Все настройки выполнены стандартно


glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);


И объект я вывожу 1 раз…



Офлайн

#6 Апрель 20, 2011 19:25:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Пересечение полигонов в OpenGl

Еще раз: не хватает геометрии.
Сцена рисуется по треугольникам (квады сводятся к ним).
Освещение считается в вершинном шейдере. Потом значения для вершин попадают в пиксельный шейдер, делающий “мягкую” заливку.
Для fixed pipeline используются те же шейдеры. Только создает их не программист, а драйвера видеокарты.
Если на пересечении двух плоскостей нет ребра (явно указанных общих вершин) — получается как раз ваш эффект.
Тесселяция (даже грубая: разбивка треугольника на три указыванием промежуточной вершины где-нибудь в центре этого треугольника) заметно уменьшает глюки, даже если ребра не попадают на линию пересечения плоскостей.
Это — базовая теория трехмерного рисования.
Справедливости ради нужно сказать: сужение дистанции между передней и задней плоскостями отсечения уменьшает динамический диапазон Z буфера, одновременно увеличивая точность (glDepthRange, glOrtho, glFrustrum). Полностью проблему не убирает (это же не геометрия), но может снизить шум до совсем незаметного.



Офлайн

#7 Апрель 21, 2011 01:50:19

DRV
От:
Зарегистрирован: 2011-04-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

Андрей Светлов
Еще раз: не хватает геометрии.
Сцена рисуется по треугольникам (квады сводятся к ним).
Освещение считается в вершинном шейдере. Потом значения для вершин попадают в пиксельный шейдер, делающий “мягкую” заливку.
Для fixed pipeline используются те же шейдеры. Только создает их не программист, а драйвера видеокарты.
Если на пересечении двух плоскостей нет ребра (явно указанных общих вершин) — получается как раз ваш эффект.
Тесселяция (даже грубая: разбивка треугольника на три указыванием промежуточной вершины где-нибудь в центре этого треугольника) заметно уменьшает глюки, даже если ребра не попадают на линию пересечения плоскостей.
Это — базовая теория трехмерного рисования.
Справедливости ради нужно сказать: сужение дистанции между передней и задней плоскостями отсечения уменьшает динамический диапазон Z буфера, одновременно увеличивая точность (glDepthRange, glOrtho, glFrustrum). Полностью проблему не убирает (это же не геометрия), но может снизить шум до совсем незаметного.
Вот эта мысль мне больше понравилась!

Ну для проверки я геометрию усложнил… И получился тот же эффект. Заниматься тесселяцией совсем было бы последнее дело… сильно усложнит модель. А вот изменение параметров плоскостей отсечения действительно помогло! Благодарю!

Вот такая картинка вышла… Что уже радует)
http://drv06.narod.ru/2.PNG

Теперь такой вопрос, может быть вы знаете какой-нибудь простой способ антиальясинга?… Везде пишут, что опен жл так и не разработала технологии сглаживания отдельно краёв полигонов. Да и в общем-то пробовал настройки эти GL_POLYGON_SMOOTH… И ясное дело не работает. Хотя на других форумал люди пишут, что на каких-то видеокарточках отличное сглаживание. Но на моём ГМА адаптере вообще нулевой эффект. Мне бы принципе подошёл антиалиасинг всей сцены, так как планируются довольно простые модельки, и быстродействие сцены не критично.. Есть ли какой-нибудь вариант исполнения чтобы применить без особых изменений в коде?..



Отредактировано (Апрель 21, 2011 01:52:42)

Офлайн

#8 Апрель 21, 2011 03:49:54

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Пересечение полигонов в OpenGl

Значительно лучше!
По хорошему нужна была не тесселяция наобум, а тривиальная вставка пары вершин в местах пересечений плоскостей (там где артефакты выползали).
Антиалиасинг: GL_MULTISAMPLE_ARB, поисковик поможет. Те же уроки от NeHe содержат пример.
Там нужно только выбрать правильный pixel format и потом включить режим перед отрисовкой.



Офлайн

#9 Апрель 21, 2011 12:08:40

DRV
От:
Зарегистрирован: 2011-04-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

Что-то тут не совсем ясно..
Во-первых переменная GL_MULTISAMPLE_ARB неопределена. Может быть я какой-то заголовочный файл нужный не подключил?

Посмотрел уроки от NeHe.. Попытался сделать, как там написано. Самая первая ошибка - неизвестный тип

PFNWGLGETEXTENSIONSSTRINGARBPROC

в инете искал-искал… Непонятно, где это определено.



Офлайн

#10 Апрель 21, 2011 12:35:40

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Пересечение полигонов в OpenGl

Дык вроде MULTISAMPLE_ARB - это расширение OpenGL, тут нужно ставить pyglew, так он и не должен увидеть.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version