Форум сайта python.su
0
При пересечении полигонов получается ужасная картинка, плоскости пересекаются не по прямой линии, как должно быть, а по какой-то ломаной, что сильно портит весь вид. Как исправить?
Картинка
http://drv06.narod.ru/scr1.PNG
Отредактировано (Апрель 19, 2011 11:59:07)
Офлайн
14
Вершин в геометрию добавить
Офлайн
0
Андрей СветловИзвините, но это не решение проблемы..
Вершин в геометрию добавить
Офлайн
3
DRV, ну не знаю. либо у вас отключен буфер глубины, либо вы по несколько раз одно и то же тело рисуете.
Офлайн
0
regallКонечно же буфер глубины включён. Все настройки выполнены стандартно
DRV, ну не знаю. либо у вас отключен буфер глубины, либо вы по несколько раз одно и то же тело рисуете.
Офлайн
14
Еще раз: не хватает геометрии.
Сцена рисуется по треугольникам (квады сводятся к ним).
Освещение считается в вершинном шейдере. Потом значения для вершин попадают в пиксельный шейдер, делающий “мягкую” заливку.
Для fixed pipeline используются те же шейдеры. Только создает их не программист, а драйвера видеокарты.
Если на пересечении двух плоскостей нет ребра (явно указанных общих вершин) — получается как раз ваш эффект.
Тесселяция (даже грубая: разбивка треугольника на три указыванием промежуточной вершины где-нибудь в центре этого треугольника) заметно уменьшает глюки, даже если ребра не попадают на линию пересечения плоскостей.
Это — базовая теория трехмерного рисования.
Справедливости ради нужно сказать: сужение дистанции между передней и задней плоскостями отсечения уменьшает динамический диапазон Z буфера, одновременно увеличивая точность (glDepthRange, glOrtho, glFrustrum). Полностью проблему не убирает (это же не геометрия), но может снизить шум до совсем незаметного.
Офлайн
0
Андрей СветловВот эта мысль мне больше понравилась!
Еще раз: не хватает геометрии.
Сцена рисуется по треугольникам (квады сводятся к ним).
Освещение считается в вершинном шейдере. Потом значения для вершин попадают в пиксельный шейдер, делающий “мягкую” заливку.
Для fixed pipeline используются те же шейдеры. Только создает их не программист, а драйвера видеокарты.
Если на пересечении двух плоскостей нет ребра (явно указанных общих вершин) — получается как раз ваш эффект.
Тесселяция (даже грубая: разбивка треугольника на три указыванием промежуточной вершины где-нибудь в центре этого треугольника) заметно уменьшает глюки, даже если ребра не попадают на линию пересечения плоскостей.
Это — базовая теория трехмерного рисования.
Справедливости ради нужно сказать: сужение дистанции между передней и задней плоскостями отсечения уменьшает динамический диапазон Z буфера, одновременно увеличивая точность (glDepthRange, glOrtho, glFrustrum). Полностью проблему не убирает (это же не геометрия), но может снизить шум до совсем незаметного.
Отредактировано (Апрель 21, 2011 01:52:42)
Офлайн
14
Значительно лучше!
По хорошему нужна была не тесселяция наобум, а тривиальная вставка пары вершин в местах пересечений плоскостей (там где артефакты выползали).
Антиалиасинг: GL_MULTISAMPLE_ARB, поисковик поможет. Те же уроки от NeHe содержат пример.
Там нужно только выбрать правильный pixel format и потом включить режим перед отрисовкой.
Офлайн
0
Что-то тут не совсем ясно..
Во-первых переменная GL_MULTISAMPLE_ARB неопределена. Может быть я какой-то заголовочный файл нужный не подключил?
Посмотрел уроки от NeHe.. Попытался сделать, как там написано. Самая первая ошибка - неизвестный тип
PFNWGLGETEXTENSIONSSTRINGARBPROC
в инете искал-искал… Непонятно, где это определено.
Офлайн
3
Дык вроде MULTISAMPLE_ARB - это расширение OpenGL, тут нужно ставить pyglew, так он и не должен увидеть.
Офлайн