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

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

Однако, если я использую glClearDepth(0.0), а затем glDepthFunc(GL_GREATER), запустив остальную без изменений программу, я получаю это: с 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.

4 голоса | спросил user1175938 30 Jam1000000amMon, 30 Jan 2012 02:34:43 +040012 2012, 02:34:43

2 ответа


0
  

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

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

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

  

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

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

ответил SigTerm 30 Jam1000000amMon, 30 Jan 2012 04:01:27 +040012 2012, 04:01:27
0
  

Если я расположил камеру в (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 измеряет расстояние, перпендикулярное   экран).

ответил Jamil 16 +04002014-10-16T02:37:49+04:00312014bEurope/MoscowThu, 16 Oct 2014 02:37:49 +0400 2014, 02:37:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132