OpenGL: Могу ли я замаскировать полностью прозрачные фрагменты из буфера глубины? - PullRequest
5 голосов
/ 04 ноября 2010

Есть ли способ сказать OpenGL не записывать глубину полностью прозрачных фрагментов в буфер глубины?

Просто убедитесь, что текстура, которую я хочу визуализировать, никогда не бывает полупрозрачной;его альфа-значения равны только 1.0 или 0.0, и я использую фильтр GL_NEAREST, поэтому он никогда не интерполируется ни в одно из промежуточных значений.

Я думаю, что для OpenGL было бы разумно просто не писатьв буфер глубины, когда у фрагмента оказывается альфа-значение 0.0 (таким образом я мог бы рендерить примитивы с такими текстурами в любом порядке), но я не могу найти способ заставить OpenGL сделать это.Кто-нибудь знает, возможно ли это и, в таком случае, как это делается?

1 Ответ

7 голосов
/ 04 ноября 2010

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

В этом случае вы можете просто использовать сбросить фрагмент в вашем фрагменте:

if( color.a<=0.0 ){
     discard;
 }

Это гарантирует, что все фрагменты, для которых условие истинно, не будут отображаться вообще (вместо того, чтобы смешиваться с нулевым коэффициентом в кадровом буфере).

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

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.0f);

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

...