将透明纹理与深度混合

时间:2010-05-22 11:17:15

标签: opengl-es textures alphablending

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

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 个答案:

答案 0 :(得分:7)

启用深度测试实际上并不按照通常的GL_LESS情况按深度对几何体进行排序,它只是防止基元在不比之前绘制的情况下更接近观察者时进行绘制。这允许您以任何您想要的顺序绘制不透明几何体并仍然获得所需结果,但正确渲染混合几何体通常需要已经渲染混合对象后面的所有内容。

以下是您应该做的事情,以使混合的不透明和混合几何看起来正确:

  1. 将混合几何体与不透明几何体分开。
  2. 将混合几何体从后向前排序。
  3. 像往常一样首先绘制所有不透明几何体。
  4. 按排序顺序绘制混合几何体。您需要启用深度测试,但暂时禁用glDepthMask(GL_FALSE)深度写入。
  5. 或者,如果你的内容总是完全不透明或完全透明,你可以启用alpha测试并禁用混合,但我猜这不是你想要的。