混合透明纹理和深度技术

5

我正在尝试混合带有透明区域的纹理:

glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, ...);
glVertexPointer( 2, GL_FLOAT, 0, ... );
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );

除非我添加glDisable(GL_DEPTH_TEST),否则顶部纹理的透明部分将覆盖它们下面的所有内容(而不是混合)。有没有不禁用深度的方法来解决这个问题?我已经尝试了各种混合函数,但没有一个能够解决问题。

1个回答

7
启用深度测试并不会实际上按深度对几何图形进行排序 - 在通常的 GL_LESS 情况下,它只是防止绘制那些没有比之前已经被绘制的物体更靠近观察者的基元。这使您可以以任意顺序绘制不透明几何图形,并仍然获得所需的结果,但正确渲染混合几何图形通常需要在混合对象后面的所有内容已经被渲染。
以下是为使不透明和混合几何图形混合看起来正确而应该做的事情:
1.将混合几何图形与不透明几何图形分开。 2.从后往前排序混合几何图形。 3.像往常一样先绘制所有不透明几何图形。 4.按排序顺序绘制混合几何图形。您将希望启用深度测试,但使用 glDepthMask(GL_FALSE) 暂时禁用深度写入。
或者,如果您的内容始终完全不透明或完全透明,您可以只启用 alpha 测试并禁用混合,但我猜这不是您想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接