Opengl es 将透明纹理与深度混合

Opengl es 将透明纹理与深度混合,opengl-es,textures,alphablending,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_DE

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

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),否则顶部纹理的透明部分将覆盖它们下面的所有内容(而不是混合)。有没有办法在不禁用深度的情况下执行此操作?我尝试过各种混合功能,但没有任何帮助。

在通常的
GL\u LESS
情况下,启用深度测试实际上不会按深度对几何体排序,它只会阻止基本体绘制,如果它们不比以前绘制的更靠近查看器。这使您可以按所需的顺序绘制不透明几何体,并且仍然可以获得所需的结果,但正确渲染混合几何体通常需要已渲染混合对象后面的所有内容

下面是要使不透明和混合几何体的混合看起来正确的步骤:

  • 将混合几何体与不透明几何体分离
  • 从后到前对混合几何体进行排序
  • 像往常一样,首先绘制所有不透明几何体
  • 按排序顺序绘制混合几何体。您希望保持启用深度测试,但使用
    glDepthMask(GL\u FALSE)
    暂时禁用深度写入
  • 或者,如果您的内容总是完全不透明或完全透明,您可以启用alpha测试并禁用混合,但我猜这不是您想要的