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);
片段着色器无法进行混合,因为它无法访问帧缓冲区。
我想使用 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);
片段着色器无法进行混合,因为它无法访问帧缓冲区。