2

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

4

4 回答 4

3
glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );

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

于 2009-08-24T10:16:34.457 回答
2

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

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

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

在 3D 游戏中,BSP 是这个问题的基本解决方案。

于 2009-08-24T04:32:29.347 回答
2

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

if(texColor.w == 0.0)
    discard;
于 2012-05-22T12:04:24.853 回答
0

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

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

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

于 2009-08-25T02:24:49.280 回答