我是OpenGL和GLSL编程的新手。最近,我需要对图像进行徒手遮罩,如下图所示。我该如何使用Fragment Shader实现此目的?
当前,我正在使用下面的片段着色器尝试此操作,但是图像上没有任何变化。
precision mediump float;
varying vec2 v_TexCoordinate;
varying vec2 v_TexCoordinate2;
uniform sampler2D u_Texture;
uniform sampler2D u_Texture2;
uniform bool u_alpha_test_enable;
void main()
{
float mask = texture2D(u_Texture, v_TexCoordinate).a;
// if (u_alpha_test_enable && mask < 0.4) discard;
gl_FragColor = texture2D(u_Texture2, v_TexCoordinate2) * vec4( 1,1,1,mask );
}
我想要像下面的图像一样的效果。
答案 0 :(得分:0)
您想要做的是对图像的特定区域进行着色。定义一个“选择”颜色(如图像中的浅绿色),然后根据mask
值,用mix
用“选择”颜色来着色纹理颜色:
void main()
{
float mask = texture2D(u_Texture, v_TexCoordinate).a;
vec3 tintColor = vec3(0.5, 1.0, 0.5); // e.g.
vec4 texColor = texture2D(u_Texture2, v_TexCoordinate2);
vec3 mixColor = mix(texColor.rgb, tintColor, 0.5*mask);
gl_FragColor = vec4(mixColor, texColor.a);
}
除了在两个颜色值之间进行插值外,还可以在纹理的颜色中添加颜色,从而产生不同的外观:
vec3 mixColor = texColor.rgb + tintColor * mask;
请注意,在您的情况下,您不想丢弃任何东西。您必须更改RGB颜色通道而不是alpha通道。