将透明纹理与深度混合

l.t*_*e.a 5 textures alphablending opengl-es

我试图混合具有透明区域的纹理:

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 );
Run Code Online (Sandbox Code Playgroud)

除非我添加glDisable(GL_DEPTH_TEST),否则顶部纹理的透明部分会覆盖它们下面的所有内容(而不是混合).有没有办法在不禁用深度的情况下做到这一点?我尝试了各种混合功能但没有帮助.

Piv*_*vot 7

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

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

  1. 将混合几何与不透明几何体分开.
  2. 从后到前对混合几何体进行排序.
  3. 像往常一样首先绘制所有不透明几何体.
  4. 按排序顺序绘制混合几何体.您需要启用深度测试但暂时禁用深度写入glDepthMask(GL_FALSE).

或者,如果您的内容总是完全不透明或完全透明,您可以启用alpha测试并禁用混合,但我猜这不是您正在寻找的内容.