summaryrefslogtreecommitdiff
path: root/src/shader/lpv.wgsl
blob: 1f84e40c8b520b3cea419d93646c503f22821895 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const DIRS = array<vec2i, 4>(vec2i(1, 0), vec2i(0, 1), vec2i(-1, 0), vec2i(0, -1));
const ATTEN: f32 = 0.999;
const W_FWD: f32 = 0.70;
const W_SIDE: f32 = 0.15;

@group(0) @binding(0) var scene: texture_2d<f32>;
@group(0) @binding(1) var src: texture_2d_array<f32>;
@group(0) @binding(2) var dst: texture_storage_2d_array<rgba16float, write>;

@compute @workgroup_size(8, 8, 1)
fn propagate(@builtin(global_invocation_id) gid: vec3<u32>) {
    let dims = textureDimensions(dst);
    if gid.x >= dims.x || gid.y >= dims.y {
        return;
    }

    let p = vec2<i32>(gid.xy);
    let s = textureLoad(scene, p, 0);
    let t = s.a;

    for (var d = 0u; d < 4u; d++) {
        let q = p - DIRS[d];
        var inc = vec3f(0.0);
        inc += textureLoad(src, q, d, 0).rgb * W_FWD;
        inc += textureLoad(src, q, (d + 1u) % 4u, 0).rgb * W_SIDE;
        inc += textureLoad(src, q, (d + 3u) % 4u, 0).rgb * W_SIDE;

        let o = inc * t * ATTEN + s.rgb * 0.25;
        textureStore(dst, p, d, vec4f(o, 1.0));
    }
}