有没有办法告诉OpenGL不要将完全透明片段的深度写入深度缓冲区?
请确保,我要渲染的纹理绝不是半透明的;它的 alpha 值只有 1.0 或 0.0,并且我使用 GL_NEAREST 过滤器,因此它永远不会插入到两者之间的任何值。
我认为当片段的 alpha 值为 0.0 时,OpenGL 能够简单地不写入深度缓冲区是合理的(这样我可以以任何顺序渲染具有此类纹理的图元),但我无法找到让 OpenGL 做到这一点的方法。有谁知道这是否可能,在这种情况下,它是如何完成的?
有没有办法告诉OpenGL不要将完全透明片段的深度写入深度缓冲区?
请确保,我要渲染的纹理绝不是半透明的;它的 alpha 值只有 1.0 或 0.0,并且我使用 GL_NEAREST 过滤器,因此它永远不会插入到两者之间的任何值。
我认为当片段的 alpha 值为 0.0 时,OpenGL 能够简单地不写入深度缓冲区是合理的(这样我可以以任何顺序渲染具有此类纹理的图元),但我无法找到让 OpenGL 做到这一点的方法。有谁知道这是否可能,在这种情况下,它是如何完成的?
澄清一下:您希望 alpha=0.0 的片段既不写入颜色缓冲区也不写入深度缓冲区?此外,我假设您当前正在使用混合来掩盖透明像素,否则这应该不是问题。
在这种情况下,您可以简单地在片段着色器中使用丢弃片段:
if( color.a<=0.0 ){
discard;
}
这将确保条件为真的所有片段都不会被渲染(而不是与零因子混合到帧缓冲区中)。
如果您(无论出于何种原因)对固定管道进行编程,您可以使用 alpha 测试来获得相同的行为(我个人建议切换到前向兼容(即着色器)路径,但这不是重点)。
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.0f);
作为额外的好处,因为这些方法会杀死片段而不是使其不可见,它可能比混合更快(尽管我最近没有研究过,所以它是可能的,但它通常不应该更慢,所以它仍然是一个加号)