【问题标题】:iPhone OpenGL ES: Applying a Depth Test on Textures that have transparent pixels for 2D gameiPhone OpenGL ES:对 2D 游戏具有透明像素的纹理应用深度测试
【发布时间】:2009-08-24 03:47:28
【问题描述】:

目前,我为 2D 游戏启用了混合和深度测试。当我绘制我的纹理时,如果它们相交,“上部”纹理会删除下部纹理的一部分。显然,深度测试考虑了纹理的透明像素,如果它们相交,它会清除绘制的下部纹理的所有颜色。此外,alpha 混合渲染不正确。有没有什么函数可以告诉 OpenGL 在深度测试中不包含透明像素?

【问题讨论】:

    标签: opengl-es transparency alphablending depth-buffer


    【解决方案1】:
    glEnable( GL_ALPHA_TEST );
    glAlphaFunc( GL_EQUAL, 1.0f );
    

    这将丢弃所有具有除完全不透明之外的任何 alpha 的像素。然后,这些像素将不会被渲染到 Z-Buffer。但是,这确实会影响各种 Z-Buffer 管道优化,因此可能会导致一些严重的减速。仅当您真的也有时才使用它。

    【讨论】:

      【解决方案2】:

      不,这是不可能的。所有硬件深度测试都是如此。

      GL(full 或 ES -- 和 D3D)都具有相同的模型 -- 它们按照您指定的多边形顺序进行绘制。如果您在多边形 B 之前绘制多边形 A,并且逻辑上多边形 A 应该在多边形 B 的前面,则多边形 B 将不会被绘制(由深度测试提供)。

      解决方案是按照从当前视图原点最远到最近的顺序绘制多边形。令人高兴的是,在 2D 游戏中,这应该只是一种简单的类型(你可能甚至不需要经常这样做)。

      在 3D 游戏中,BSP 是解决此问题的基本方法。

      【讨论】:

        【解决方案3】:

        如果您使用着色器,可以尝试禁用混合并丢弃 alpha 0 的像素

        if(texColor.w == 0.0)
            discard;
        

        【讨论】:

          【解决方案4】:

          您使用的是什么类型的混合?

          glEnable(GL_BLEND);
          glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
          

          应防止任何 alpha 为 0 的片段写入深度缓冲区。

          【讨论】:

          • 字母混合不是在 Z 测试之后进行吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          • 2011-11-16
          • 1970-01-01
          • 2011-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多