在OpenGL ES中进行透明度和深度测试的解决方法?

时间:2011-08-12 23:17:54

标签: android opengl-es transparency depth-buffer

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

  

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.

我在OpenGL的透明度常见问题解答页面上阅读了:

  

在应用程序中使用深度缓冲时,您需要小心   关于渲染基元的顺序。完全不透明   需要首先渲染基元,然后部分不透明   原始数据按顺序排列。如果你不渲染原语   这个顺序,原始,否则将通过一个可见   部分不透明的原语,可能完全失去深度测试。

这让我想到了我的问题。我有2个正方形,都是64x64。它们有一个圆圈纹理。 “顶部”方块位于下方正方形的下方,如此。

___________
|  .____.  |
| /      \ |
|_|______|_|
|  .____.  |
| /      \ |
| |   s  | |
|  \____/ t|
|__________|

圆形纹理是形成圆形的纯色,然后是完全透明的周围区域(t)。

当OpenGL渲染时,下方的方块未通过深度测试并且未被绘制,即使其上方的像素是透明的,因此您从下面的层获得半圆效果,而不是整个图像。 / p>

    BAD                   GOOD
___________           ___________
|  .____.  |          |  .____.  |
| /      \ |          | /      \ |
|_|______|_|          |_|      |_|
|  .____.  |          | \.____./ |
| /      \ |          | /      \ |
| |      | |          | |      | |
|  \____/  |          |  \____/  |
|__________|          |__________|

如何阻止这种情况发生?

1 个答案:

答案 0 :(得分:2)

在创建时:

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

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