1

我正在尝试使用 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|
|__________|

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

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

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

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

4

1 回答 1

2

创建时:

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

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

于 2011-08-19T19:38:37.983 回答