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