1float color_brightness(float3 color) {
2 // REC. 601 luminance coefficients for perceived brightness
3 return dot(color, float3(0.30f, 0.59f, 0.11f));
4}
5
6float light_on_dark_contrast(float enhancedContrast, float3 color) {
7 float brightness = color_brightness(color);
8 float multiplier = saturate(4.0f * (0.75f - brightness));
9 return enhancedContrast * multiplier;
10}
11
12float enhance_contrast(float alpha, float k) {
13 return alpha * (k + 1.0f) / (alpha * k + 1.0f);
14}
15
16float apply_alpha_correction(float a, float b, float4 g) {
17 float brightness_adjustment = g.x * b + g.y;
18 float correction = brightness_adjustment * a + (g.z * b + g.w);
19 return a + a * (1.0f - a) * correction;
20}
21
22float apply_contrast_and_gamma_correction(float sample, float3 color, float enhanced_contrast_factor, float4 gamma_ratios) {
23 float enhanced_contrast = light_on_dark_contrast(enhanced_contrast_factor, color);
24 float brightness = color_brightness(color);
25
26 float contrasted = enhance_contrast(sample, enhanced_contrast);
27 return apply_alpha_correction(contrasted, brightness, gamma_ratios);
28}