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),否则顶部纹理的透明部分会覆盖它们下方的所有内容(而不是混合)。有没有办法在不禁用深度的情况下做到这一点?我尝试了各种混合功能,但没有任何帮助。

4

1 回答 1

7

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

以下是你应该做的,以获得不透明和混合几何的混合看起来正确:

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

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

于 2010-05-23T18:08:40.410 回答