OpenGL GLSL 纹理透明度

OpenGL GLSL texture transparency

我想使用 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 实现这一点?

您需要启用 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);

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