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