Android OpenGL ES中透明度和深度测试的变通方法?

Android OpenGL ES中透明度和深度测试的变通方法?,android,opengl-es,transparency,depth-buffer,Android,Opengl Es,Transparency,Depth Buffer,我正在尝试使用draw_纹理扩展在OpenGL ES上正确进行深度测试。我很早就意识到,使用此扩展渲染时,“正常”z坐标不起作用。这是由于扩展有效地使用Z坐标作为0和1之间的比率,而不是OpenGL OES绘制纹理页面所示的深度缓冲区中的实际Z位置: Zs映射到窗口深度Zw,如下所示: { n, if z <= 0 Zw = { f, if z >= 1

我正在尝试使用draw_纹理扩展在OpenGL ES上正确进行深度测试。我很早就意识到,使用此扩展渲染时,“正常”z坐标不起作用。这是由于扩展有效地使用Z坐标作为0和1之间的比率,而不是OpenGL OES绘制纹理页面所示的深度缓冲区中的实际Z位置:

Zs映射到窗口深度Zw,如下所示:

             { n,                 if z <= 0
        Zw = { f,                 if z >= 1
             { n + z * (f - n),   otherwise

where <n> and <f> are the near and far values of
DEPTH_RANGE.
圆形纹理是形成圆形的纯色,然后是完全透明的周围区域(t)

当OpenGL渲染它时,下面的正方形未通过深度测试,并且没有被绘制,即使上面的像素是透明的,因此您可以从下面的层而不是整个图像获得半圆效果

    BAD                   GOOD
___________           ___________
|  .____.  |          |  .____.  |
| /      \ |          | /      \ |
|_|______|_|          |_|      |_|
|  .____.  |          | \.____./ |
| /      \ |          | /      \ |
| |      | |          | |      | |
|  \____/  |          |  \____/  |
|__________|          |__________|
如何阻止这种情况发生?

关于创建:

gl.glEnable(GL10.GL_ALPHA_TEST);
gl.glAlphaFunc(GL10.GL_GREATER,0.2f); 

这解决了问题,但您可能需要根据您的纹理将0.2f更改为更高或更低。

gl.glEnable(GL10.gl\u ALPHA\u测试)的组合;gl.glAlphaFunc(GL10.glu更大,0.0f);在某种程度上确实有效,但alpha>0且<255的纹理的任何部分都将像以前一样被视为实体对象,因此圆形纹理边缘周围的transparent边界将变得可见,因为纹理中有一个过渡周期(不只是从圆形直接剪切到透明).将glAlphaFunc设置为0.2对我来说效果很好,基本上回答了这个问题。
gl.glEnable(GL10.GL_ALPHA_TEST);
gl.glAlphaFunc(GL10.GL_GREATER,0.2f);