Skip to main content

COMPOSITE_FRAG

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";