X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fgraphics%2Fshaders%2Fnpatch-visual-mask-shader.frag;h=626a3ff945cb45248a9b7948e2a24116b0efbe33;hp=6b85462b6c15e155367e002cd45cacdc37739e55;hb=b861f4c549049d55142a0f913bd1fab701511544;hpb=7875069ceecfd24c2a8cf3a28564f7d115296e93 diff --git a/dali-toolkit/internal/graphics/shaders/npatch-visual-mask-shader.frag b/dali-toolkit/internal/graphics/shaders/npatch-visual-mask-shader.frag index 6b85462..626a3ff 100644 --- a/dali-toolkit/internal/graphics/shaders/npatch-visual-mask-shader.frag +++ b/dali-toolkit/internal/graphics/shaders/npatch-visual-mask-shader.frag @@ -14,10 +14,24 @@ void main() // where mask is translucent, less of background should be shown. // auxiliaryImageAlpha controls how much of mask is visible - mediump vec4 color = texture2D( sTexture, vTexCoord ); - mediump vec4 mask= texture2D( sMask, vMaskTexCoord ); + mediump vec4 color = texture2D(sTexture, vTexCoord); + mediump vec4 mask = texture2D(sMask, vMaskTexCoord); - mediump vec3 mixedColor = color.rgb * mix( 1.0-mask.a, 1.0, 1.0-auxiliaryImageAlpha) - + mask.rgb*mask.a * auxiliaryImageAlpha; - gl_FragColor = vec4(mixedColor,1.0) * uColor * vec4( mixColor, 1.0 ); + mediump float maskAlpha = mask.a * auxiliaryImageAlpha; + + lowp vec3 preMultipliedMaskRGB = mask.rgb * mix(mask.a, 1.0, preMultipliedAlpha) * auxiliaryImageAlpha; + lowp vec3 preMultipliedTextureRGB = color.rgb * mix(color.a, 1.0, preMultipliedAlpha); + + // Manual blend operation with premultiplied colors. + // Final alpha = maskAlpha + (1.0 - maskAlpha) * color.a. + // (Final rgb * alpha) = preMultipliedMaskRGB + (1.0 - maskAlpha) * preMultipliedTextureRGB + // If preMultipliedAlpha == 1.0, just return vec4(rgb*alpha, alpha) + // Else, return vec4((rgb*alpha) / alpha, alpha) + + lowp float finalAlpha = mix(color.a, 1.0, maskAlpha); + lowp vec3 finalMultipliedRGB = preMultipliedMaskRGB + (1.0 - maskAlpha) * preMultipliedTextureRGB; + + // TODO : Need to find some way without division + lowp vec4 finalColor = vec4(finalMultipliedRGB * mix(1.0 / finalAlpha, 1.0, preMultipliedAlpha), finalAlpha); + gl_FragColor = finalColor * uColor * vec4(mixColor, 1.0); }