DRV
Апрель 19, 2011 11:58:56
При пересечении полигонов получается ужасная картинка, плоскости пересекаются не по прямой линии, как должно быть, а по какой-то ломаной, что сильно портит весь вид. Как исправить?
Картинка
http://drv06.narod.ru/scr1.PNG
Андрей Светлов
Апрель 19, 2011 19:10:27
Вершин в геометрию добавить
DRV
Апрель 19, 2011 23:54:47
Андрей Светлов
Вершин в геометрию добавить
Извините, но это не решение проблемы..
Есть у кого-нибудь конструктивные предложения? Кто знает, как сделать?
regall
Апрель 20, 2011 00:56:47
DRV, ну не знаю. либо у вас отключен буфер глубины, либо вы по несколько раз одно и то же тело рисуете.
DRV
Апрель 20, 2011 18:32:26
regall
DRV, ну не знаю. либо у вас отключен буфер глубины, либо вы по несколько раз одно и то же тело рисуете.
Конечно же буфер глубины включён. Все настройки выполнены стандартно
…
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
…
И объект я вывожу 1 раз…
Андрей Светлов
Апрель 20, 2011 19:25:04
Еще раз: не хватает геометрии.
Сцена рисуется по треугольникам (квады сводятся к ним).
Освещение считается в вершинном шейдере. Потом значения для вершин попадают в пиксельный шейдер, делающий “мягкую” заливку.
Для fixed pipeline используются те же шейдеры. Только создает их не программист, а драйвера видеокарты.
Если на пересечении двух плоскостей нет ребра (явно указанных общих вершин) — получается как раз ваш эффект.
Тесселяция (даже грубая: разбивка треугольника на три указыванием промежуточной вершины где-нибудь в центре этого треугольника) заметно уменьшает глюки, даже если ребра не попадают на линию пересечения плоскостей.
Это — базовая теория трехмерного рисования.
Справедливости ради нужно сказать: сужение дистанции между передней и задней плоскостями отсечения уменьшает динамический диапазон Z буфера, одновременно увеличивая точность (glDepthRange, glOrtho, glFrustrum). Полностью проблему не убирает (это же не геометрия), но может снизить шум до совсем незаметного.
DRV
Апрель 21, 2011 01:50:19
Андрей Светлов
Еще раз: не хватает геометрии.
Сцена рисуется по треугольникам (квады сводятся к ним).
Освещение считается в вершинном шейдере. Потом значения для вершин попадают в пиксельный шейдер, делающий “мягкую” заливку.
Для fixed pipeline используются те же шейдеры. Только создает их не программист, а драйвера видеокарты.
Если на пересечении двух плоскостей нет ребра (явно указанных общих вершин) — получается как раз ваш эффект.
Тесселяция (даже грубая: разбивка треугольника на три указыванием промежуточной вершины где-нибудь в центре этого треугольника) заметно уменьшает глюки, даже если ребра не попадают на линию пересечения плоскостей.
Это — базовая теория трехмерного рисования.
Справедливости ради нужно сказать: сужение дистанции между передней и задней плоскостями отсечения уменьшает динамический диапазон Z буфера, одновременно увеличивая точность (glDepthRange, glOrtho, glFrustrum). Полностью проблему не убирает (это же не геометрия), но может снизить шум до совсем незаметного.
Вот эта мысль мне больше понравилась!
Ну для проверки я геометрию усложнил… И получился тот же эффект. Заниматься тесселяцией совсем было бы последнее дело… сильно усложнит модель. А вот изменение параметров плоскостей отсечения действительно помогло! Благодарю!
Вот такая картинка вышла… Что уже радует)
http://drv06.narod.ru/2.PNGТеперь такой вопрос, может быть вы знаете какой-нибудь простой способ антиальясинга?… Везде пишут, что опен жл так и не разработала технологии сглаживания отдельно краёв полигонов. Да и в общем-то пробовал настройки эти GL_POLYGON_SMOOTH… И ясное дело не работает. Хотя на других форумал люди пишут, что на каких-то видеокарточках отличное сглаживание. Но на моём ГМА адаптере вообще нулевой эффект. Мне бы принципе подошёл антиалиасинг всей сцены, так как планируются довольно простые модельки, и быстродействие сцены не критично.. Есть ли какой-нибудь вариант исполнения чтобы применить без особых изменений в коде?..
Андрей Светлов
Апрель 21, 2011 03:49:54
Значительно лучше!
По хорошему нужна была не тесселяция наобум, а тривиальная вставка пары вершин в местах пересечений плоскостей (там где артефакты выползали).
Антиалиасинг: GL_MULTISAMPLE_ARB, поисковик поможет. Те же уроки от NeHe содержат пример.
Там нужно только выбрать правильный pixel format и потом включить режим перед отрисовкой.
DRV
Апрель 21, 2011 12:08:40
Что-то тут не совсем ясно..
Во-первых переменная GL_MULTISAMPLE_ARB неопределена. Может быть я какой-то заголовочный файл нужный не подключил?
Посмотрел уроки от NeHe.. Попытался сделать, как там написано. Самая первая ошибка - неизвестный тип
PFNWGLGETEXTENSIONSSTRINGARBPROC
в инете искал-искал… Непонятно, где это определено.
regall
Апрель 21, 2011 12:35:40
Дык вроде MULTISAMPLE_ARB - это расширение OpenGL, тут нужно ставить pyglew, так он и не должен увидеть.