Найти - Пользователи
Полная версия: Пересечение полигонов в OpenGl
Начало » Центр помощи » Пересечение полигонов в OpenGl
1 2
DRV
При пересечении полигонов получается ужасная картинка, плоскости пересекаются не по прямой линии, как должно быть, а по какой-то ломаной, что сильно портит весь вид. Как исправить?

Картинка
http://drv06.narod.ru/scr1.PNG
Андрей Светлов
Вершин в геометрию добавить
DRV
Андрей Светлов
Вершин в геометрию добавить
Извините, но это не решение проблемы..

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


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


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

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

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

Теперь такой вопрос, может быть вы знаете какой-нибудь простой способ антиальясинга?… Везде пишут, что опен жл так и не разработала технологии сглаживания отдельно краёв полигонов. Да и в общем-то пробовал настройки эти GL_POLYGON_SMOOTH… И ясное дело не работает. Хотя на других форумал люди пишут, что на каких-то видеокарточках отличное сглаживание. Но на моём ГМА адаптере вообще нулевой эффект. Мне бы принципе подошёл антиалиасинг всей сцены, так как планируются довольно простые модельки, и быстродействие сцены не критично.. Есть ли какой-нибудь вариант исполнения чтобы применить без особых изменений в коде?..
Андрей Светлов
Значительно лучше!
По хорошему нужна была не тесселяция наобум, а тривиальная вставка пары вершин в местах пересечений плоскостей (там где артефакты выползали).
Антиалиасинг: GL_MULTISAMPLE_ARB, поисковик поможет. Те же уроки от NeHe содержат пример.
Там нужно только выбрать правильный pixel format и потом включить режим перед отрисовкой.
DRV
Что-то тут не совсем ясно..
Во-первых переменная GL_MULTISAMPLE_ARB неопределена. Может быть я какой-то заголовочный файл нужный не подключил?

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

PFNWGLGETEXTENSIONSSTRINGARBPROC

в инете искал-искал… Непонятно, где это определено.
regall
Дык вроде MULTISAMPLE_ARB - это расширение OpenGL, тут нужно ставить pyglew, так он и не должен увидеть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB