// #include //ly.img.cesdk/shader/common/ubq_adjustments uniform shader image; uniform float4x4 colorMatrix; uniform float4 colorOffset; uniform float gamma; uniform float shadows; uniform float highlights; uniform float whites; uniform float blacks; uniform float clarity; uniform float temperature; uniform float sharpness; float4 applyClarityAdjustment(float4 color, float2 coord, float clarity) { // L = Left, R = Right, C = Center, T = Top, B = Bottom float4 colLB = image.eval(coord + float2(-1, 1)); float4 colLC = image.eval(coord + float2(-1, 0.0)); float4 colLT = image.eval(coord + float2(-1, -1)); float4 colCL = image.eval(coord + float2(0.0, -1)); float4 colCR = image.eval(coord + float2(0.0, 1)); float4 colRB = image.eval(coord + float2(1, 1)); float4 colRC = image.eval(coord + float2(1, 0.0)); float4 colRT = image.eval(coord + float2(1, -1)); float4 mergedColor = color; mergedColor.rgb += colLB.rgb + colLC.rgb + colLT.rgb; mergedColor.rgb += colCL.rgb + colCR.rgb; mergedColor.rgb += colRB.rgb + colRC.rgb + colRT.rgb; mergedColor /= 9.0; // 1.0 and 0.0 result in white not black, therefore we clamp float grayValue = clamp(color.r * 0.3 + color.g * 0.59 + color.b * 0.1, 0.111111, 0.999999); // Here we create a function that will map values below 0.1 to 0. Values above 0.2 will be mapped to 1, // and for values between 0.1 and 0.2 it will produce a gradient. // The funtion is mirror at 0.5, meaning values between 0.8 and 0.9 will result in a decending gradient. // And values above 0.9 will be mapped to 0. float frequenceFactor = min(smoothstep(1.0 - grayValue, 0.0, 0.11), smoothstep(grayValue, 0.0, 0.11)); // here we apply the high pass filter. Its strength is determined by the uniform , // and the frequence factor. That means the only the mid tones are affected by this filter. // Clarity input is ranging from -1 to 1. But we want to strengthen the effect. // Therefore we see this little magic number '3.7'. color.rgb = clamp(color + clamp((color - mergedColor) * clarity * 3.7 * frequenceFactor, 0.0, 10.0), 0.0, 1.0).rgb; // apply exposure but only to the mid tones. color.rgb = color.rgb * pow(2.0, clarity * 0.27 * frequenceFactor); return clamp(color, 0.0, 1.0); } float4 applySharpnessAdjustment(float4 color, float2 coord, float sharpness) { float factor = mix(0.2, -1.0, float(sharpness > 0.0)); float4 sharpenedColor = mix(0.2, 5.0, float(sharpness > 0.0)) * color; sharpenedColor += factor * clamp(image.eval(coord + float2(-1.0, 0.0)), 0.0, 1.0); sharpenedColor += factor * clamp(image.eval(coord + float2(0.0, -1.0)), 0.0, 1.0); sharpenedColor += factor * clamp(image.eval(coord + float2(0.0, 1.0)), 0.0, 1.0); sharpenedColor += factor * clamp(image.eval(coord + float2(1.0, 0.0)), 0.0, 1.0); sharpenedColor = clamp(sharpenedColor, 0.0, 1.0); color = clamp(mix(color, sharpenedColor, abs(sharpness)), 0.0, 1.0); return color; } float luma(float3 color) { return dot(color, float3(0.299, 0.587, 0.114)); } half4 main(float2 coord) { float4 color = clamp(image.eval(coord), 0.0, 1.0); color = unpremul(color); if (clarity != 0.0) { color = applyClarityAdjustment(color, coord, clarity); } if (sharpness != 0.0) { color = applySharpnessAdjustment(color, coord, sharpness); } if (temperature != 0.0) { color = applyTemperatureAdjustment(color, temperature); } // Perform if (gamma != 1.0) { color = applyGammaAdjustment(color, gamma); } if (shadows != 0.0 || highlights != 0.0) { color = applyShadowsAndHighlightsAdjustment(color, shadows, highlights); } color = applyColorMatrixAdjustment(color, colorMatrix, colorOffset); if (blacks != 0.0 || whites != 0.0) { color = applyBlacksAndWhitesAdjustment(color, blacks, whites); } color.rgb *= color.a; return clamp(color, 0.0, 1.0); }