diff options
author | metamuffin <metamuffin@disroot.org> | 2023-11-18 00:25:56 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-11-18 00:25:56 +0100 |
commit | e3d15b63589ba41a559c55d2953ba1d166e833bb (patch) | |
tree | 57d948322200a7d3d5cd11fbc825d66a20627445 /flowy/src/shader.wgsl | |
parent | efd347cf8252fbf5cf2b5c075d3c149a4b8b5f36 (diff) | |
download | video-codec-experiments-e3d15b63589ba41a559c55d2953ba1d166e833bb.tar video-codec-experiments-e3d15b63589ba41a559c55d2953ba1d166e833bb.tar.bz2 video-codec-experiments-e3d15b63589ba41a559c55d2953ba1d166e833bb.tar.zst |
a
Diffstat (limited to 'flowy/src/shader.wgsl')
-rw-r--r-- | flowy/src/shader.wgsl | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/flowy/src/shader.wgsl b/flowy/src/shader.wgsl index 1597ff6..bfa4176 100644 --- a/flowy/src/shader.wgsl +++ b/flowy/src/shader.wgsl @@ -1,11 +1,50 @@ @group(0) @binding(0) var output: texture_storage_2d<bgra8unorm, write>; @group(0) @binding(1) var texa: texture_2d<f32>; +@group(0) @binding(2) var texb: texture_2d<f32>; +const SDIST: i32 = 4; + +const NN: vec2<i32> = vec2(-1,-1); +const NP: vec2<i32> = vec2(-1,1); +const PN: vec2<i32> = vec2(1,-1); +const PP: vec2<i32> = vec2(1,1); @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) global_id: vec3<u32>) { - let p = textureLoad(texa, global_id.xy, 0); - textureStore(output, global_id.xy, p); + let uv = vec2<i32>(global_id.xy); + let orig = textureLoad(texa, uv, 0); + let orignn = textureLoad(texa, uv+NN, 0); + let orignp = textureLoad(texa, uv+NP, 0); + let origpn = textureLoad(texa, uv+PN, 0); + let origpp = textureLoad(texa, uv+PP, 0); + + var best_sim = 1000.; + var best_coord = vec2(0,0); + for (var x = -SDIST; x <= SDIST; x++) { + for (var y = -SDIST; y <= SDIST; y++) { + let ov = uv + vec2(x,y); + let samp = textureLoad(texb, ov, 0); + let sampnn = textureLoad(texb, ov+NN, 0); + let sampnp = textureLoad(texb, ov+NP, 0); + let samppn = textureLoad(texb, ov+PN, 0); + let samppp = textureLoad(texb, ov+PP, 0); + let d = distance(samp.rgb, orig.rgb) + + distance(sampnn.rgb, orignn.rgb) + + distance(sampnp.rgb, orignp.rgb) + + distance(samppn.rgb, origpn.rgb) + + distance(samppp.rgb, origpp.rgb); + if d < best_sim { + best_sim = d; + best_coord = vec2(x,y); + } + }} + + let col = vec4(colormap_vec(vec2<f32>(best_coord) / f32(SDIST)), 1.); + + textureStore(output, global_id.xy, col); } +fn colormap_vec(v: vec2<f32>) -> vec3<f32> { + return vec3(v.y, v.x - 0.5 * v.y, -v.x - 0.5 * v.y); +} |