struct Params { block_size: vec2, offsets_stride: u32 } struct BlockOffset { score: f32, offset: vec2, tint: vec3, } @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; @group(0) @binding(4) var out: texture_storage_2d; @compute @workgroup_size(1)fn main(@builtin(global_invocation_id) global_id: vec3) { let uv = vec2(global_id.xy) * params.block_size; let bl = offsets[global_id.x + global_id.y * params.offsets_stride]; 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 col = vec4(colormap_vec(vec2(bl.offset) * 0.05),1.); textureStore(out, base, col); } } } fn colormap_vec(v: vec2) -> vec3 { return vec3(v.y, v.x - 0.5 * v.y, -v.x - 0.5 * v.y); }