struct Params { block_size: vec2, offsets_stride: u32 } struct BlockOffset { score: f32, offset: vec2, } @group(0) @binding(0) var params: Params; @group(0) @binding(1) var offsets: array; @group(0) @binding(2) var next: texture_2d; @group(0) @binding(3) var prev: texture_2d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) global_id: vec3) { let uv = vec2(global_id.xy) * params.block_size; var best_err = 100000000.; var best_offset = vec2(0,0); for (var ox = -5; ox <= 5; ox++) { for (var oy = -5; oy <= 5; oy++) { let offset = vec2(ox,oy); var err = 0.; for (var x = 0; x < params.block_size.x; x++) { for (var y = 0; y < params.block_size.y; y++) { let base = uv+vec2(x,y); let pcol = textureLoad(prev, base+offset, 0).rgb; let ncol = textureLoad(next, base, 0).rgb; err += distance(pcol, ncol); }} if err < best_err { best_err = err; best_offset = offset; } }} offsets[global_id.x + global_id.y * params.offsets_stride] = BlockOffset(best_err, best_offset); } // fn colormap_vec(v: vec2) -> vec3 { // return vec3(v.y, v.x - 0.5 * v.y, -v.x - 0.5 * v.y); // }