OpenGL透明度不正常工作

3
我在项目中遇到了透明度问题。你可以看到,其他物体的透明度都正常 - 你可以看到树叶后面的犀牛,但问题出现在树本身上。当有两个树枝,其中一个比另一个更近时,较远的那个不可见。树干也是同样的情况。透明度对于对象本身就没有起作用。
这是我在创建纹理时使用的代码:
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);

Image of my scene

1个回答

4
虽然你生成的片段的颜色是透明的,但它们仍然被写入深度缓冲区,因此你的树的某些三角形会遮挡其他三角形,尽管它们不影响颜色缓冲区。
要正确地渲染透明对象,你必须:
  1. 首先绘制所有不透明的对象
  2. 禁用深度缓冲区写入
  3. 对透明三角形进行排序
  4. 按照从后往前的顺序渲染透明三角形。
不过,有一个技巧可以避免上述复杂性。如果你只接受两个alpha值(零和一),那么你可以启用alpha测试(glAlphaFunc)来完全丢弃透明片段。

所以我研究了你建议的技巧,删除了混合并在片段着色器中添加了简单的代码 if (color.a < 0.5) discard; else gl_FragColor = color;。这很有帮助。现在我唯一的问题是,在我的光照设置下,当物体因光照而完全变黑时,片段会被丢弃。 - Karlos Otruba
@KarlosOtruba:这是不正确的。如果对象是不透明的黑色,则应该有 color = vec4(0,0,0,1),如果你观察到其他东西,那么你的光照代码中一定存在错误。 - Yakov Galka
谢谢您的解释!我通过阅读您的评论,找到了代码问题的解决方法。 - SRG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接