Почему GL_LEQUAL рекомендуется для функции глубины GL (и почему она не работает для меня)? - PullRequest
5 голосов
/ 30 января 2012

В GL wiki они рекомендуют использовать GL_LEQUAL для функции глубины. Кроме того, функция глубины по умолчанию GL_LESS. Когда я использую любую из этих функций, я получаю странные результаты. На этом рисунке красный квадрат должен быть перед синим (оба квадрата одинакового размера): with GL_LESS

Однако, если я использую glClearDepth(0.0), а затем glDepthFunc(GL_GREATER), запустив остальную без изменений программу, я получу это: with GL_GREATER

Если подумать немного больше, то имеет смысл, что GL_LESS даст результаты, которые он делает: если входящее значение глубины меньше сохраненного, фрагмент записывается.

Если я расположил камеру на (1, 0, 0) и посмотрел в сторону (0, 0, 0), я ожидаю, что объект на (0.5, 0, 0) будет перед объектом на (0, 0, 0). С GL_LESS не будет ли объект в (0, 0, 0) тем, чьи фрагменты написаны?

EDIT: Никол, спасибо за упоминание матрицы проекции. Кажется, что он был установлен неправильно. Я некоторое время следил за вашим руководством на arcsynthesis.org и адаптировал код для своего собственного проекта, но я отклонился от вашей матрицы проекции и использовал математику, описанную на странице руководства glFrustum, для реализации моей собственной версии этой функции, а затем использовал NeHe gluPerspective замена на замену gluPerspective. Я не знаю, почему замены не работали, потому что моя матричная математика верна (я проверил это по различным онлайн-калькуляторам). Используя вашу матрицу, я получаю правильный результат с GL_LESS.

Ответы [ 2 ]

18 голосов
/ 30 января 2012

Почему GL_LEQUAL рекомендуется для функции глубины GL

Шейдеры.Многопроходная молния с возможностью прохождения (возможно, с бампмэппингом).Чтобы сделать это, вам придется рисовать один и тот же объект в одной позиции / глубине несколько раз, но с разными параметрами шейдера / смешивания И тест глубины должен быть включен (запись глубины может быть отключена после 1-го эпизода).GL_LESS будет вырезать 2-й проход и каждый проход после этого.GL_LEQUAL не будет, и освещение будет работать правильно.

GL_LEQUAL не вызовет z-бой сам по себе, z-бой происходит, когда у вас есть два почти параллельных многоугольника с общим почти идентичным местоположением.Эффект можно уменьшить, увеличив точность буфера глубины.В прошлом его также можно было уменьшить, используя w-буфер (по крайней мере, в DirectX), но AFAIK эта функция больше не популярна.

На этом рисунке красный квадрат должен быть впередисинего цвета (оба квадрата одинакового размера):

Невозможно правильно ответить без исходного кода.

1 голос
/ 16 октября 2014

Если я расположил свою камеру в (1, 0, 0) и посмотрел в сторону (0, 0, 0), я ожидаю, что объект в (0,5, 0, 0) будет перед объектом в точке (0, 0 0). С GL_LESS не будет ли объект в (0, 0, 0) тем, чьи фрагменты записаны?

По этой ссылке: http://www -01.ibm.com / support / Knowledgecenter / ssw_aix_71 / com.ibm.aix.opengl / doc / openglrf / glDepthFunc.htm% 23b5afa88027vbia ,

Функция glDepthFunc определяет функцию, используемую для сравнения каждого значение z входящего пикселя со значением z, присутствующим в буфере глубины. " Также указано, что: "GL_LESS проходит, если входящее значение z меньше сохраненного значения z.

Здесь: значение z - это расстояние от камеры до объекта. Это приводит к тому, что на экране будет нарисован более близкий объект. Это также объясняется здесь: http://www.glprogramming.com/red/chapter10.html

Цитирую по последней ссылке:

Буфер глубины

Буфер глубины хранит значение глубины для каждого пикселя. Как описано в «Набор для выживания при удалении скрытой поверхности» в главе 5, глубина обычно измеряется с точки зрения расстояния до глаза, поэтому пиксели с большим значения буфера глубины перезаписываются пикселями с меньшими значениями. Это всего лишь полезное соглашение, и буфер глубины поведение может быть изменено, как описано в «Тесте глубины». Глубина буфер иногда называют буфером z (z исходит из того факта, что что значения x и y измеряют горизонтальное и вертикальное смещение на экран, а значение z измеряет расстояние, перпендикулярное экран).

...