OpenGL GLSL纹理透明度

Pro*_*icT 4 c++ opengl transparency textures glsl

我想使用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);
}
Run Code Online (Sandbox Code Playgroud)

但这使得透明只有alpha等于0的像素,我想保持纹理的淡入淡出.例如,在此图片中,第一个图像是纹理,第二个是纹理蒙版,第三个是期望的结果:

例

纹理和纹理掩码位于一个32位位图中.

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

Die*_*Epp 6

您需要启用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);
Run Code Online (Sandbox Code Playgroud)

如果你使用预乘alpha,

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

如果你使用非预乘的alpha,

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

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

  • 是的...如果你绘制透明对象,你不能使用普通的深度测试,你必须对对象进行排序并从后到前绘制(除非你使用与顺序无关的透明度,但大多数人不这样做)。典型的场景将从固体对象开始(从前到后,以获得更好的性能),然后是透明对象,透明对象必须从后到前。 (2认同)