struct CameraUniform { eye: vec4, vp: mat4x4, }; struct VertexInput { @location(0) position: vec3, @location(1) tan_frame: u32, }; struct VertexOutput { @builtin(position) clip_position: vec4, @location(0) position: vec3, @location(1) color: vec3, }; @group(0) @binding(0) var camera: CameraUniform; fn random(seed: u32, salt: f32) -> f32 { return abs(sin((f32(seed & u32(0x11111)) * 0.7071 + salt) * 78.233)); } @vertex fn vs_main( @builtin(instance_index) mesh_idx: u32, @builtin(vertex_index) vertex_idx: u32, vertex: VertexInput, ) -> VertexOutput { let world_pos = vertex.position; var out: VertexOutput; out.clip_position = camera.vp * vec4(world_pos, 1.0); out.position = world_pos; out.color.r = random(vertex_idx, f32(1.0) + world_pos.x); out.color.g = random(vertex_idx, f32(2.0) + world_pos.y); out.color.b = random(vertex_idx, f32(3.0) + world_pos.z); return out; } @fragment fn fs_main( frag: VertexOutput, ) -> @location(0) vec4 { return vec4(frag.color, 1.0); }