struct Configuration { gridSize: vec2f, aspect: vec2f }; @group(0) @binding(0) var config: Configuration; @group(0) @binding(1) var state: array; struct VertexInput { @location(0) position: vec2f, @builtin(instance_index) instance: u32, }; struct VertexOutput { @builtin(position) position: vec4f, @location(0) cell: vec2f, }; struct FragmentInput { @location(0) cell: vec2f, }; @vertex fn vertexMain(input: VertexInput) -> VertexOutput { let position = input.position * 0.5 + 0.5; let instance = f32(input.instance); let state = f32(state[input.instance]); let cell = vec2f(instance % config.gridSize.x, floor(instance / config.gridSize.y)); let grid = (position * state + cell) / config.gridSize; var output: VertexOutput; output.position = vec4f((grid * 2 - 1) * config.aspect, 0, 1); output.cell = cell / config.gridSize; return output; } @fragment fn fragmentMain(input: FragmentInput) -> @location(0) vec4f { return vec4f(input.cell, 0, 1); }