【问题标题】:OpenGL GLSL texture transparencyOpenGL GLSL 纹理透明度
【发布时间】:2015-03-20 16:15:19
【问题描述】:

我想使用 GLSL 在我的 32 位位图纹理上设置透明度。 我的片段着色器如下所示:

#version 120
uniform sampler2D myTexture;
varying vec2 TexCoord;

void main(void)
{
    if(texture2D(myTexture, TexCoord).a != 1.0f)
    {
        discard;
    }
    gl_FragColor = texture2D(myTexture, TexCoord);
}

但这只会使 alpha 等于 0 的像素变得透明,并且 我想保持纹理的淡入淡出。例如在这张图片中,第一张图片是纹理,第二张是纹理蒙版,第三张是想要的结果:

纹理和纹理掩码在一个 32 位位图中。

有谁知道,如何使用 GLSL 实现这一目标?

【问题讨论】:

  • 我知道,但这只是即时模式,它真的不准确,我想用着色器来做。混合还会在蒙版周围产生一些令人讨厌的透明边框。
  • 混合在着色器和现代 OpenGL 中效果很好。

标签: c++ opengl textures glsl transparency


【解决方案1】:

您需要启用GL_BLEND,片段着色器的 alpha 输出将用于将片段输出与帧缓冲区混合。

glEnable(GL_BLEND);
glBlendFunc(..., ...);

glDraw????(...);

// You don't have to do it here, but GL_BLEND will remain enabled
// until you disable it again.
glDisable(GL_BLEND);

如果你使用预乘 alpha,

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

如果你使用非预乘 alpha,

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

片段着色器无法进行混合,因为它无权访问帧缓冲区。

【讨论】:

  • 好的,谢谢,请告诉我,我怎样才能去除纹理的残留物,以便可以通过纹理对象看到?在这张图片i.imgur.com/QDmXb0z.png?1 中,您可以看到一个滑块和插入符号。透明度在插入符号上,但通过 alpha 像素看不到条。为什么?
  • 是的...如果你画透明物体,你不能使用普通的深度测试,你必须将物体排序并从后向前绘制(除非你使用顺序无关的透明度,但是大多数人没有)。一个典型的场景将从实体对象开始(从前到后,以获得更好的性能),然后是透明对象,透明对象必须是从后到前。
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多