Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL透明度无法正常工作_Opengl_Transparency_Alpha - Fatal编程技术网

OpenGL透明度无法正常工作

OpenGL透明度无法正常工作,opengl,transparency,alpha,Opengl,Transparency,Alpha,我的项目透明度有问题。正如你所看到的,其他物体的透明度也很好——你可以看到树叶后面的犀牛,但问题是树本身。如果有两个分支,且其中一个分支比另一个分支更近,则另一个分支不可见。后备箱也一样。透明度只是不适用于对象本身 这是我在创建纹理时使用的代码: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glGenTextures(1, &m_texture); glBindTexture(GL_TEX

我的项目透明度有问题。正如你所看到的,其他物体的透明度也很好——你可以看到树叶后面的犀牛,但问题是树本身。如果有两个分支,且其中一个分支比另一个分支更近,则另一个分支不可见。后备箱也一样。透明度只是不适用于对象本身

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

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

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

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

  • 首先绘制所有不透明对象
  • 禁用深度缓冲区写入
  • 对透明三角形排序
  • 从后到前渲染透明三角形

  • 不过,有一个技巧可以避免上述复杂性。如果只有两个alpha值(0和1)可以,则可以启用alpha测试(glAlphaFunc)以完全丢弃透明碎片。

    因此,我正在研究您建议的技巧,删除了混合,并在fragmnt着色器中添加了简单代码
    If(color.a<0.5)discard;else gl_FragColor=颜色这很有帮助。我现在唯一的问题是,在我的照明设置中,当对象由于照明而完全变黑时,碎片会被丢弃。@KarlosOtruba:这是不正确的。如果对象是不透明的黑色,那么它应该有
    color=vec4(0,0,0,1)
    ,如果你观察到其他东西,那么你的照明代码中一定有错误。谢谢你的解释!通过阅读您的评论,我发现了代码的问题。