Как я могу записать значение в буфер глубины, отличное от значения, используемого для сравнения глубины?

Можно ли в Open GL визуализировать многоугольник с включенным обычным тестом глубины, но когда значение буфера глубины фактически записывается в буфер глубины, я хочу написать собственное значение?

(Причина в том, что я отрисовываю систему частиц, которая должна быть проверена на глубину по геометрии в сцене, но я хочу записать очень большое значение глубины в том месте, где находится система частиц, таким образом используя размытие глубины после этап обработки для дальнейшего размытия системы частиц)

Обновление Чтобы еще больше уточнить вопрос, возможно ли это без рендеринга в несколько проходов?

3 ответа

Решение

Вы не

OpenGL не позволяет вам лгать. Тест глубины проверяет значение в буфере глубины по отношению к входящему значению, которое будет записано в буфере глубины. Как только этот тест пройден, проверенное значение глубины будет записано в буфер глубины. Период.

Вы не можете (ab) использовать тест глубины, чтобы делать что-то кроме тестирования значений глубины.

ARB_conservative_depth / GL 4.2 действительно позволяет вам очень ограниченную форму этого. По сути, вы обещаете реализацию, что вы будете изменять глубину только таким образом, чтобы она была меньше или больше первоначального значения. Но даже тогда это будет работать только в определенных случаях, и только в том случае, если вы будете оставаться в указанных вами пределах.

Проведение ранних тестов фрагментов также не позволит вам сделать это. В спецификации прямо указано, что глубина будет записана до того, как ваш шейдер будет выполнен. Итак, все, что вы пишете gl_FragDepth будут игнорироваться

Один из способов сделать это за один проход — выполнить проверку глубины «вручную».

Установлен к GL_ALWAYS

Затем во фрагментном шейдере семплируем текущее значение буфера глубины и в зависимости от него отбрасываем фрагмент с помощью discard;

Чтобы сэмплировать текущее значение буфера глубины, вам нужно либо (обычно на мобильных платформах) или . Последнее, однако, даст неопределенные результаты, если несколько частиц одного и того же вызова отрисовки отображаются друг над другом, в то время как первое в этом случае будет использовать записанное значение глубины последней частицы, визуализируемой в том же месте.

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

Вы можете использовать gl_FragDepth во фрагментном шейдере, чтобы записать свои собственные значения.

gl_FragDepth = 0.3;

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragDepth.xhtml

Другие вопросы по тегам