#version 330 /* Faded Film / Eastmancolor (1970s-1980s) — picom shader Warm Eastmancolor dye degradation. Taxi Driver, The Godfather era. Cyan dye fades first, magenta persists longest, lifted maroon blacks. */ in vec2 texcoord; uniform sampler2D tex; const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722); float hash(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * .1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); } float vignette(vec2 uv) { vec2 d = uv - 0.5; float dist = length(d); return 1.0 - smoothstep(0.4, 1.1, dist) * 0.15; } vec4 window_shader() { vec2 texsize = textureSize(tex, 0); vec4 pixColor = texture2D(tex, texcoord / texsize, 0); vec3 color = pixColor.rgb; // Fade amount — 0.6 is moderate, recognizable but not extreme float fade = 0.6; // Cyan dye loss — red channel lifts as cyan absorption weakens color.r += 0.08 * fade; color.g += 0.02 * fade; // Yellow dye loss — blue channel loses contrast color.b -= 0.04 * fade; // Magenta shift — magenta dye persists longest float magentaShift = fade * 0.12; color.r += magentaShift; color.b += magentaShift * 0.3; color.g -= magentaShift * 0.5; // Lifted blacks to dark maroon (shadow density loss) float blackLift = fade * 0.08; color = max(color, vec3(blackLift * 1.2, blackLift * 0.7, blackLift * 0.5)); // Desaturation — dye fading means less color intensity float luma = dot(color, LUMA); float desatAmount = mix(1.0, 0.65, fade); color = mix(vec3(luma), color, desatAmount); // Reduced contrast — faded prints are lower contrast color = mix(vec3(0.5), color, mix(1.0, 0.85, fade)); // Warm color temperature shift color.r += 0.03 * fade; color.b -= 0.05 * fade; // Medium grain vec2 screenPos = gl_FragCoord.xy; float grain = (hash(screenPos * 0.6) - 0.5) * 0.04; // Luminance-dependent grain float grainMask = 1.0 - abs(luma - 0.5) * 1.5; grainMask = clamp(grainMask, 0.3, 1.0); color += grain * grainMask; // Vignette vec2 normalizedCoord = texcoord / texsize; color *= vignette(normalizedCoord); return vec4(clamp(color, 0.0, 1.0), 1.0); }