OpenGL ES中透明度和深度测试的解决方案



我试图让深度测试在OpenGL ES上正确工作,使用draw_texture扩展。我很早就意识到,当使用这个扩展渲染时,"正常"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.

我在OpenGL的透明度FAQ页面上读到:

在应用程序中使用深度缓冲时,您需要小心关于呈现原语的顺序。完全不透明首先需要渲染原语,然后是部分不透明的原语按从后到前的顺序排列。如果你不渲染原语这个顺序,原语,否则可以通过部分不透明的原语,可能会完全失去深度测试。

这使我想到了我的问题。我有2个正方形,都是64x64。它们有一个圆的纹理。像这样,"上"方框的位置比下面的方框稍低一些。
___________
|  .____.  |
| /       |
|_|______|_|
|  .____.  |
| /       |
| |   s  | |
|  ____/ t|
|__________|

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

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

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

我怎样才能阻止这种情况的发生?

On create:

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

这修复了这个问题,但是你可能需要根据你的纹理将0.2f更改为更高或更低。

最新更新