Как записать / предотвратить запись в буфер глубины OpenGL в GLSL

#android #opengl-es #glsl #opengl-es-2.0

#Android #opengl-es #glsl #opengl-es-2.0

Вопрос:

Я хочу записывать в буфер глубины OpenGL, только если текущий пиксель имеет альфа> 0,5, как это сделать?

Если пиксель имеет альфа < 0,5, я хочу отобразить цвет, но не записывать его глубину в буфер глубины. Команда discard — это не то, что я ищу, поскольку она отбрасывает информацию о цвете и глубине; Я хочу отбросить только информацию о глубине.

Есть gl_FragDepth переменная, которую можно установить, но в какое значение? И для случая alpha < 0.5, как оставить gl_FragDepth без изменений?

Должен ли я использовать FBO для этого, или он также должен работать без? Проект, над которым я работаю, является проектом GLES 2.0 для Android

Комментарии:

1. Я не думаю, что вы можете сделать это за один проход, по крайней мере, не напрямую и не эффективно. Вы, конечно, можете установить gl_FragDepth в значение, которое приведет к сбою теста глубины (например, zfar), но это также приведет к изменению цвета фрагмента. При двух проходах с использованием разных альфа-тестов это должно сработать … но на ES вы, вероятно, не можете позволить себе еще один такой проход.

Ответ №1:

Я решил проблему для себя, используя

 glDepthMask(false)
  

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