// Vertex shader struct Camera { view_pos: vec4, view: mat4x4, view_proj: mat4x4, inv_proj: mat4x4, inv_view: mat4x4, } @group(0) @binding(0) var camera: Camera; struct Light { position: vec3, color: vec3, } @group(1) @binding(0) var light: Light; struct VertexInput { @location(0) position: vec3, }; struct VertexOutput { @builtin(position) clip_position: vec4, @location(0) color: vec3, }; @vertex fn vs_main( model: VertexInput, ) -> VertexOutput { let scale = 0.25; var out: VertexOutput; out.clip_position = camera.view_proj * vec4(model.position * scale + light.position, 1.0); out.color = light.color; return out; } // Fragment shader @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { return vec4(in.color, 1.0); }