【发布时间】:2009-08-24 03:47:28
【问题描述】:
目前,我为 2D 游戏启用了混合和深度测试。当我绘制我的纹理时,如果它们相交,“上部”纹理会删除下部纹理的一部分。显然,深度测试考虑了纹理的透明像素,如果它们相交,它会清除绘制的下部纹理的所有颜色。此外,alpha 混合渲染不正确。有没有什么函数可以告诉 OpenGL 在深度测试中不包含透明像素?
【问题讨论】:
标签: opengl-es transparency alphablending depth-buffer
目前,我为 2D 游戏启用了混合和深度测试。当我绘制我的纹理时,如果它们相交,“上部”纹理会删除下部纹理的一部分。显然,深度测试考虑了纹理的透明像素,如果它们相交,它会清除绘制的下部纹理的所有颜色。此外,alpha 混合渲染不正确。有没有什么函数可以告诉 OpenGL 在深度测试中不包含透明像素?
【问题讨论】:
标签: opengl-es transparency alphablending depth-buffer
glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );
这将丢弃所有具有除完全不透明之外的任何 alpha 的像素。然后,这些像素将不会被渲染到 Z-Buffer。但是,这确实会影响各种 Z-Buffer 管道优化,因此可能会导致一些严重的减速。仅当您真的也有时才使用它。
【讨论】:
不,这是不可能的。所有硬件深度测试都是如此。
GL(full 或 ES -- 和 D3D)都具有相同的模型 -- 它们按照您指定的多边形顺序进行绘制。如果您在多边形 B 之前绘制多边形 A,并且逻辑上多边形 A 应该在多边形 B 的前面,则多边形 B 将不会被绘制(由深度测试提供)。
解决方案是按照从当前视图原点最远到最近的顺序绘制多边形。令人高兴的是,在 2D 游戏中,这应该只是一种简单的类型(你可能甚至不需要经常这样做)。
在 3D 游戏中,BSP 是解决此问题的基本方法。
【讨论】:
如果您使用着色器,可以尝试禁用混合并丢弃 alpha 0 的像素
if(texColor.w == 0.0)
discard;
【讨论】:
您使用的是什么类型的混合?
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
应防止任何 alpha 为 0 的片段写入深度缓冲区。
【讨论】: