diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2026-09-09 22:29:14 -0700 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2026-09-10 19:11:27 -0700 |
| commit | 054c967e4a06bbbf79359bae701e1b467625839c (patch) | |
| tree | b03cacbfbca32fc0b55772cd269422fa65e9803e /src/shader/lpv.wgsl | |
| parent | ba59c1a12f2c1ee39b32736953844e6158282c88 (diff) | |
Diffstat (limited to 'src/shader/lpv.wgsl')
| -rw-r--r-- | src/shader/lpv.wgsl | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/shader/lpv.wgsl b/src/shader/lpv.wgsl new file mode 100644 index 0000000..1f84e40 --- /dev/null +++ b/src/shader/lpv.wgsl @@ -0,0 +1,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)); + } +}
\ No newline at end of file |
