【问题标题】:Sprite quads & depth testing correctly in OpenGL ES 2在 OpenGL ES 2 中正确进行精灵四边形和深度测试
【发布时间】:2011-08-16 00:26:03
【问题描述】:

我正在尝试使用 OpenGL ES 2 在 3D 环境中渲染 2D(平面)精灵。我创建每个精灵的方式非常标准:我创建了一个由两个三角形组成的四边形,并将纹理映射到上面。一切正常,除了我注意到一些奇怪的事情:当深度测试打开时(它应该处于 3D 模式),我的精灵的角使用背景颜色绘制。

最简单的展示方式是通过插图:


当我关闭深度测试时(在左侧),它看起来很好,但是当我打开它时(在右侧),您可以看到绿色精灵的矩形重叠在黄色精灵的顶部。它们都使用相同的代码、相同的 PNG 文件、相同的着色器。除了深度测试,一切都一样。

我希望有人知道解决这个问题的方法。

【问题讨论】:

    标签: opengl-es opengl-es-2.0


    【解决方案1】:

    您可以做的是 alpha 测试。基本上你的纹理必须有一个 0 的 alpha 值,它应该是透明的(它可能已经有)。然后你配置 alpha 测试,例如

    glAlphaFunc(GL_GREATER, 0.5f);
    glEnable(GL_ALPHA_TEST);
    

    这样,每个 alpha 值

    ...
    if(color.a < 0.5)
        discard;
    ...
    

    那么你就不需要固定功能的 alpha 测试(我认为这就是它在现代桌面 GL 中被弃用的原因,不了解 ES)。

    编辑:查看 ES 2.0 规范后,似乎不再有固定功能的 alpha 测试,因此您必须像上面写的那样在片段着色器中进行。这样,您还可以使其依赖于特定颜色或任何其他可计算属性,而不是 Alpha 通道。

    【讨论】:

    • 在发布之前,我确实研究了 GL_ALPHA_TEST 的想法,并且正如您还发现的那样,它不可用。我试过你的着色器测试,它看起来是个好主意,但由于某种原因它没有效果。
    • @Mike Strange,您是否确保纹理在透明部分的 alpha 为零(如果使用 alpha 进行比较)?而且您还使用 RGBA 纹理(而不仅仅是 RGB)?
    • 我的错误。 :) 我正在对颜色均匀进行测试。我需要做的是——lowp vec4 color = Color * texture2D(Texture, TexCoordOut); if (color.a
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-11-22
    相关资源
    最近更新 更多