我正在尝试使用OpenGL ES 2在3D环境中渲染2D(平面)精灵。我创建每个精灵的方式非常标准:我创建一个由两个三角形组成的四边形,然后将纹理映射到它上面。一切都很好,除了我注意到一些奇怪的事情:当打开深度测试时(它应该在3D模式下),我的精灵的角落都是用背景颜色绘制的。
显示这一点的最简单方法是举例说明:
当我关闭深度测试时(在左侧)它看起来很好,但当我打开它(在右边)时,你可以看到绿色精灵的矩形重叠在黄色精灵的顶部。它们都使用相同的代码,相同的PNG文件,相同的着色器。除深度测试外,一切都是一样的。
我希望有人可能知道解决这个问题的方法。
答案 0 :(得分:5)
你可以做的是alpha测试。基本上你的纹理必须有一个alpha值为0,它应该是透明的(它可能已经有)。然后配置像alpha。这样的alpha测试。
glAlphaFunc(GL_GREATER, 0.5f);
glEnable(GL_ALPHA_TEST);
这样,具有α值<= 0.5的每个像素(或更好的片段)将不被写入帧缓冲器(因此不会被写入深度缓冲器)。您也可以通过丢弃片段来自己在片段着色器中进行alpha测试:
...
if(color.a < 0.5)
discard;
...
然后你不需要固定功能的alpha测试(我认为这就是它在现代桌面GL中被弃用的原因,不了解ES)。
编辑:在查看ES 2.0规范后,似乎没有固定功能的alpha测试,所以你必须在片段着色器中完成,如上所述。这样,您还可以使其依赖于特定颜色或任何其他可计算属性,而不是alpha通道。