1 varying mediump vec2 vTexCoord;
2 varying mediump vec2 vMaskTexCoord;
3 uniform sampler2D sTexture;
4 uniform sampler2D sMask;
5 uniform lowp vec4 uColor;
6 uniform lowp vec3 mixColor;
7 uniform lowp float preMultipliedAlpha;
8 uniform mediump float auxiliaryImageAlpha;
12 // Where mask image is transparent, all of background image must show through.
13 // where mask image is opaque, only mask should be shown
14 // where mask is translucent, less of background should be shown.
15 // auxiliaryImageAlpha controls how much of mask is visible
17 mediump vec4 color = texture2D(sTexture, vTexCoord);
18 mediump vec4 mask = texture2D(sMask, vMaskTexCoord);
20 mediump float maskAlpha = mask.a * auxiliaryImageAlpha;
22 lowp vec3 preMultipliedMaskRGB = mask.rgb * mix(mask.a, 1.0, preMultipliedAlpha) * auxiliaryImageAlpha;
23 lowp vec3 preMultipliedTextureRGB = color.rgb * mix(color.a, 1.0, preMultipliedAlpha);
25 // Manual blend operation with premultiplied colors.
26 // Final alpha = maskAlpha + (1.0 - maskAlpha) * color.a.
27 // (Final rgb * alpha) = preMultipliedMaskRGB + (1.0 - maskAlpha) * preMultipliedTextureRGB
28 // If preMultipliedAlpha == 1.0, just return vec4(rgb*alpha, alpha)
29 // Else, return vec4((rgb*alpha) / alpha, alpha)
31 lowp float finalAlpha = mix(color.a, 1.0, maskAlpha);
32 lowp vec3 finalMultipliedRGB = preMultipliedMaskRGB + (1.0 - maskAlpha) * preMultipliedTextureRGB;
34 // TODO : Need to find some way without division
35 lowp vec4 finalColor = vec4(finalMultipliedRGB * mix(1.0 / finalAlpha, 1.0, preMultipliedAlpha), finalAlpha);
36 gl_FragColor = finalColor * uColor * vec4(mixColor, 1.0);