precision highp float; varying vec2 v_TexCoords; uniform sampler2D u_CameraTex; uniform sampler2D u_Mask; uniform sampler2D u_sMeanBA; uniform vec2 u_RenderSize; // tweakable parameters uniform float uMinSmoothing; uniform float uPhotoScreen; uniform float uSCurve; vec3 phScreen(vec3 a, vec3 b) { return vec3(1.0) - (vec3(1.0) - a) * (vec3(1.0) - b); } vec3 phScreen(vec3 a, vec3 b, float opacity) { return mix(a, phScreen(a, b), opacity); } vec3 phDesaturate(vec3 a) { return vec3(a.x * 0.3 + a.y * 0.59 + a.z * 0.11); } void main() { vec2 uv = vec2(v_TexCoords.x, 1.0 - v_TexCoords.y); vec4 base = texture2D(u_CameraTex, uv); vec4 mask = texture2D(u_Mask, uv); vec4 meanAB = texture2D(u_sMeanBA, uv); vec3 smoothed = meanAB.w * base.xyz + meanAB.xyz; // Uncomment to apply skin-smoothing to a masked area on the screen base.xyz = mix(base.xyz, smoothed.xyz, max(uMinSmoothing, mask.b * mask.a)); // Increase brightness base.xyz = phScreen(base.xyz, base.xyz, uPhotoScreen); // remap the linear color curve to a s-curve to enhance contrast vec3 color = mix(base.xyz, smoothstep(0.0, 1.0, base.xyz), uSCurve); vec4 finalColor = vec4(color, 1.0); color = clamp(color, vec3(0.0), vec3(1.0)); gl_FragColor = finalColor; }