Constant COMPOSITE_FRAG
Source pub const COMPOSITE_FRAG: &str = "// composite.frag \u{2014} combine scene + bloom + postfx\n#version 330 core\n\nin vec2 f_uv;\nuniform sampler2D u_scene;\nuniform sampler2D u_bloom;\nuniform float u_bloom_intensity;\nuniform vec3 u_tint;\nuniform float u_saturation;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_vignette;\nuniform float u_grain_intensity;\nuniform float u_grain_seed;\nuniform float u_chromatic;\nuniform float u_scanline_intensity;\nuniform bool u_scanlines_enabled;\n\nout vec4 o_color;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main() {\n // Chromatic aberration\n float ca = u_chromatic;\n vec2 offset = (f_uv - 0.5) * ca;\n float r = texture(u_scene, f_uv + offset).r;\n float g = texture(u_scene, f_uv).g;\n float b = texture(u_scene, f_uv - offset).b;\n vec3 color = vec3(r, g, b);\n\n // Add bloom\n vec3 bloom = texture(u_bloom, f_uv).rgb;\n color += bloom * u_bloom_intensity;\n\n // Tint\n color *= u_tint;\n\n // Brightness\n color += u_brightness;\n\n // Contrast\n color = (color - 0.5) * u_contrast + 0.5;\n\n // Saturation\n float lum = dot(color, vec3(0.299, 0.587, 0.114));\n color = mix(vec3(lum), color, u_saturation);\n\n // Vignette\n vec2 vig_uv = f_uv * 2.0 - 1.0;\n float vig = 1.0 - dot(vig_uv, vig_uv) * u_vignette;\n color *= vig;\n\n // Film grain\n float grain = rand(f_uv + vec2(u_grain_seed)) * 2.0 - 1.0;\n color += grain * u_grain_intensity;\n\n // CRT scanlines\n if (u_scanlines_enabled) {\n float scanline = sin(f_uv.y * float(textureSize(u_scene, 0).y) * 3.14159) * 0.5 + 0.5;\n color *= 1.0 - u_scanline_intensity * (1.0 - scanline);\n }\n\n o_color = vec4(clamp(color, 0.0, 1.0), 1.0);\n}\n";