【问题标题】:OpenGL transparency not working properlyOpenGL透明度无法正常工作
【发布时间】:2015-07-20 23:33:11
【问题描述】:

我的项目的透明度存在问题。如您所见,透明度对于其他物体来说效果很好——您可以看到树叶后面的犀牛,但问题在于树本身。当有两个分支并且一个比另一个更近时,更远的一个是不可见的。与后备箱相同。透明度不适用于对象本身。

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

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);

【问题讨论】:

    标签: opengl transparency alpha


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以我正在研究你建议的技巧并删除了混合并将简单的代码添加到片段着色器if (color.a < 0.5) discard; else gl_FragColor = color; 这有帮助。我现在唯一的问题是,当物体由于光照而全黑时,我的光照设置会丢弃片段。
    • @KarlosOtruba:这是不正确的。如果对象是不透明的黑色,那么它应该有color = vec4(0,0,0,1),如果你观察到别的东西,那么你的照明代码中一定有一个错误。
    • 感谢您的解释!通过阅读您的评论,我发现了我的代码问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多