【发布时间】:2011-10-26 05:09:15
【问题描述】:
我正在尝试使用 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
___________ ___________
| .____. | | .____. |
| / \ | | / \ |
|_|______|_| |_| |_|
| .____. | | \.____./ |
| / \ | | / \ |
| | | | | | | |
| \____/ | | \____/ |
|__________| |__________|
我怎样才能阻止这种情况发生?
【问题讨论】:
-
gl.glEnable(GL10.GL_ALPHA_TEST)的组合; gl.glAlphaFunc(GL10.GL_GREATER,0.0f);在某种程度上确实有效,但是 alpha > 0 和
-
将 glAlphaFunc 设置为 0.2 对我来说效果很好,并且几乎回答了这个问题。
标签: android opengl-es transparency depth-buffer