Skip to main content

ROOM_BLUR_WGSL

Constant ROOM_BLUR_WGSL 

Source
pub const ROOM_BLUR_WGSL: &str = r#"
struct Frame {
    view_proj: mat4x4f, eye: vec4f, right: vec4f, up: vec4f, forward: vec4f,
    lens: vec4f, sun: vec4f, sun_color: vec4f, extent: vec4f,
    volume_lo: vec4f, volume_hi: vec4f, volume_color: vec4f, volume_control: vec4f,
}
@group(0) @binding(0) var<uniform> frame: Frame;
@group(0) @binding(2) var low_color: texture_2d<f32>;
@group(0) @binding(3) var low_depth: texture_2d<f32>;
@vertex fn vs_main(@builtin(vertex_index) vertex: u32) -> @builtin(position) vec4f {
    let xy = array<vec2f, 3>(vec2f(-1.0,-1.0),vec2f(3.0,-1.0),vec2f(-1.0,3.0));
    return vec4f(xy[vertex], 0.0, 1.0);
}
override low_scale: f32 = 4.0;
@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {
    let pixel = vec2i(position.xy);
    let last = vec2i(min(vec2f(textureDimensions(low_color)), ceil(frame.extent.xy / low_scale))) - vec2i(1);
    let centre = textureLoad(low_depth, pixel, 0).x;
    let edge = 0.01 + 0.05 * centre;
    var total = vec4f(0.0);
    var weight = 0.0;
    for (var y = -1; y <= 1; y++) {
        for (var x = -1; x <= 1; x++) {
            let at = clamp(pixel + vec2i(x, y), vec2i(0), last);
            let depth = textureLoad(low_depth, at, 0).x;
            let w = exp(-f32(x * x + y * y) * 0.5) * select(0.0, 1.0, abs(depth - centre) < edge);
            total += textureLoad(low_color, at, 0) * w;
            weight += w;
        }
    }
    return total / max(weight, 0.000001);
}
"#;