OpenGL 透明度无法正常工作

OpenGL transparency not working properly

我的项目透明度有问题。如您所见,透明度对于其他对象工作正常 - 您可以看到树叶后面的犀牛,但问题出在树本身。当有两个分支并且一个比另一个更近时,更远的一个是不可见的。与行李箱相同。透明度对对象本身不起作用。

这是我创建纹理时使用的代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

虽然您生成的片段的颜色是透明的,但它们仍会写入深度缓冲区,因此尽管不影响颜色缓冲区,树的某些三角形会遮挡其他三角形。

要正确渲染透明对象,您必须

  1. 先画出所有不透明的物体
  2. 禁用深度缓冲区写入
  3. 对透明三角形进行排序
  4. 从后向前渲染透明三角形。

虽然有一个技巧可以避免上述复杂性。如果您只接受两个 alpha 值(零和一),则可以启用 alpha 测试 (glAlphaFunc) 以完全丢弃透明片段。