【问题标题】:Workaround for transparency and depth testing in OpenGL ES?在 OpenGL ES 中进行透明度和深度测试的解决方法?
【发布时间】: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


【解决方案1】:

创建时:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多