glColorMask и glDepthMask определяют, в какие части буфера кадра на самом деле записываются.
Идея раннего отбраковки Z состоит в том, чтобы сначала визуализировать только часть буфера глубины - реальная экономия достигается за счет сортировки геометрии близко к далекой, чтобы графический процессор мог быстро отбрасывать закупоренные фрагменты. Однако при рисовании Z-буфера вы не хотите рисовать компонент цвета: это позволяет переключать шейдеры, текстурирование, т. Е. Все, что требует значительных вычислительных ресурсов.
Предупреждение: Ранний Z работает только с непрозрачной геометрией . На самом деле весь буфер буфера глубины работает только для непрозрачных вещей. Как только вы сделаете смешивание, вам придется сортировать далеко или близко и не использовать буферизацию глубины (ищите «прозрачную для порядка прозрачность» для алгоритмов, чтобы преодолеть связанные проблемы).
S, если у вас есть что-то смешанное, удалите его со стадии 'раннего Z'.
В первом проходе вы устанавливаете
glDepthMask(1); // enable depth buffer writes
glColorMask(0,0,0); // disable color buffer writes
glDepthFunc(GL_LESS); // use normal depth oder testing
glEnable(GL_DEPTH_TEST); // and we want to perform depth tests
После завершения прохода Z вы немного меняете настройки
glDepthMask(0); // don't write to the depth buffer
glColorMask(1,1,1); // now set the color component
glDepthFunc(GL_EQUAL); // only draw if the depth of the incoming fragment
// matches the depth already in the depth buffer
GL_LEQUAL тоже выполняет эту работу, но также позволяет фрагментам даже ближе, чем в проходе буфера глубины. Но поскольку обновление буфера глубины не происходит, все, что находится между источником и сохраненной глубиной, будет перезаписывать его каждый раз, когда что-то рисуется там.
Небольшое изменение темы - использование заполненного буфера глубины «ранний Z» в качестве буфера геометрии в нескольких отложенных проходах затемнения.
Чтобы сохранить дальнейшую геометрию, взгляните на Запросы окклюзии . При запросах окклюзии вы спрашиваете, сколько GPU, если какие-либо фрагменты проходят все тесты. Это воксельный движок, вы, вероятно, используете дерево октод или Kd. Рисование пространственно-разделительных граней (с помощью glDepthMask (0), glColorMask (0,0,0)) ветвей дерева перед прохождением по ветке говорит вам, видна ли вообще какая-либо геометрия в этой ветви. Это в сочетании с почти-сильно отсортированным обходом и (грубым) усечением усеченного дерева даст вам ОГРОМНОЕ повышение производительности.