@group(0) @binding(0) var output: texture_storage_2d; @group(0) @binding(1) var texa: texture_2d; @group(0) @binding(2) var texb: texture_2d; const SDIST: i32 = 4; const NN: vec2 = vec2(-1,-1); const NP: vec2 = vec2(-1,1); const PN: vec2 = vec2(1,-1); const PP: vec2 = vec2(1,1); @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) global_id: vec3) { let uv = vec2(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(best_coord) / f32(SDIST)), 1.); textureStore(output, global_id.xy, col); } fn colormap_vec(v: vec2) -> vec3 { return vec3(v.y, v.x - 0.5 * v.y, -v.x - 0.5 * v.y); }