OpenGL:我可以从深度缓冲区中屏蔽完全透明的片段吗?

Dol*_*000 5 opengl transparency depth-buffer

有没有办法告诉OpenGL不要将完全透明的片段深度写入深度缓冲区?

可以肯定的是,我想渲染的纹理永远不会是半透明的; 它的alpha值只有1.0或0.0,我使用GL_NEAREST过滤器,所以它永远不会插入到它们之间的任何值.

我认为当一个片段的alpha值为0.0时,OpenGL能够简单地不写入深度缓冲区是合理的(这样我可以按任意顺序渲染具有这种纹理的图元),但是我找不到让OpenGL做到这一点的方法.有谁知道它是否可能,在这种情况下,它是如何完成的?

Gri*_*zly 8

只是为了澄清:你想要将alpha = 0.0的片段写入colorbuffer和depthbuffer?此外,我假设您正在使用混合来屏蔽透明像素,否则这应该不是问题.

在这种情况下,您可以简单地使用丢弃片段分片器中的片段:

if( color.a<=0.0 ){
     discard;
 }
Run Code Online (Sandbox Code Playgroud)

这将确保条件为真的所有片段根本不会被渲染(而不是与零因子混合到帧缓冲器上).

如果您(无论出于何种原因)编程固定管道,您可以使用alpha测试来获得相同的行为(我个人建议切换到前向兼容(意味着着色器)路径,但那就是这一点).

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.0f);
Run Code Online (Sandbox Code Playgroud)

作为一个额外的好处,因为这些方法杀死片段而不是让它变得不可见,它可能比混合更快(虽然我最近没有调查过,所以它是一种可能,但它通常不应该更慢,所以它仍然是一个加号)

  • 首先,我仍然希望保持与某些设备的向后兼容性.然而,即便如此,固定功能管道确实具有以下优点:可以轻松组合各种功能(例如选择启用照明,alpha测试,纹理和c.彼此独立),而无需实现整个元编程系统用于着色器代码组合.如果你问我,这是非常重要的. (2认同)