#version 330 /* Film Noir (1940s-1950s) — picom shader Classic Hollywood B&W. High contrast, crushed blacks, silver gelatin. Super XX panchromatic stock with low-key lighting aesthetic. */ in vec2 texcoord; uniform sampler2D tex; // BT.601 — period-appropriate panchromatic film response const vec3 LUMA_601 = vec3(0.299, 0.587, 0.114); 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); // Heavy vignette — fast lens wide open, ~1.5 stops corner falloff return 1.0 - smoothstep(0.25, 0.9, dist) * 0.35; } vec4 window_shader() { vec2 texsize = textureSize(tex, 0); vec4 pixColor = texture2D(tex, texcoord / texsize, 0); // Luminance conversion float luma = dot(pixColor.rgb, LUMA_601); // High-contrast sigmoid S-curve float contrast = 2.8; float midpoint = 0.45; luma = 1.0 / (1.0 + exp(-contrast * 6.0 * (luma - midpoint))); // Additional black crush luma = smoothstep(0.02, 0.98, luma); // Luminance-dependent film grain vec2 screenPos = gl_FragCoord.xy; float noise = (hash(screenPos * 0.5) - 0.5) * 2.0; // More grain in midtones, less in deep shadows and bright highlights float grainMask = 1.0 - abs(luma - 0.45) * 1.8; grainMask = clamp(grainMask, 0.2, 1.0); luma += noise * 0.06 * grainMask; luma = clamp(luma, 0.0, 1.0); // Silver gelatin toning — very slight warm shadows, cool highlights vec3 warmBlack = vec3(0.02, 0.01, 0.0); vec3 coolWhite = vec3(0.97, 0.97, 1.0); vec3 color = mix(warmBlack, coolWhite, luma); // Vignette vec2 normalizedCoord = texcoord / texsize; color *= vignette(normalizedCoord); return vec4(clamp(color, 0.0, 1.0), 1.0); }