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)); } [[stage(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; } [[stage(fragment)]] fn fs_main( frag: VertexOutput, ) -> [[location(0)]] vec4 { return vec4(frag.color, 1.0); }