如何在Android中使用glsl Shader在下面的图像上创建自由手膜?

时间:2019-05-11 04:55:20

标签: android image-processing opengl-es glsl shader

我是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 );
}

我想要像下面的图像一样的效果。

1 个答案:

答案 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通道。