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实现这一目标?
您需要启用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)
片段着色器无法进行混合,因为它无法访问帧缓冲区.