#version 330 core out vec4 FragColor; in vec2 TexCoord; uniform sampler2D InputTexture; uniform float contrastValue; // Expecting value e.g., -100 to 100 // Perceptually accurate contrast adjustment vec3 applyContrast(vec3 color, float contrast) { float factor = pow(2.0, contrast / 50.0); // Exponential scaling for more natural feel // Use 0.18 as middle gray (photographic standard) const vec3 midPoint = vec3(0.18); // Apply contrast with proper pivot point return midPoint + factor * (color - midPoint); } void main() { vec4 color = texture(InputTexture, TexCoord); color.rgb = applyContrast(color.rgb, contrastValue); // Clamp results to valid range FragColor = vec4(clamp(color.rgb, vec3(0.0), vec3(1.0)), color.a); }