pub const UNLIT_WGSL: &str = "// Simple Unlit Shader - With camera and model transforms\n// Renders geometry with a flat white color (no lighting, no vertex colors)\n\n// --- Camera Uniforms (group 0, binding 0) ---\n\nstruct CameraUniforms {\n view_projection: mat4x4<f32>,\n camera_position: vec4<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> camera: CameraUniforms;\n\n// --- Model Uniforms (group 1, binding 0) ---\n\nstruct ModelUniforms {\n model_matrix: mat4x4<f32>,\n normal_matrix: mat4x4<f32>,\n};\n\n@group(1) @binding(0)\nvar<uniform> model: ModelUniforms;\n\n// --- Material Uniforms (group 2, binding 0) ---\n\n// Note: WGSL Uniform struct size MUST exactly match the Rust `MaterialUniforms` struct size\n// sent by the renderer, even if we don\'t use all the fields in the Unlit pipeline.\nstruct MaterialUniforms {\n base_color: vec4<f32>,\n emissive: vec3<f32>,\n specular_power: f32,\n ambient: vec3<f32>,\n _padding: f32,\n};\n\n@group(2) @binding(0)\nvar<uniform> material: MaterialUniforms;\n\n// Vertex input matching the standard mesh layout: pos + normal + uv\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n};\n\n// Output from vertex shader to fragment shader\nstruct VertexOutput {\n @builtin(position) clip_position: vec4<f32>,\n @location(0) normal: vec3<f32>,\n};\n\n// Vertex shader - transforms positions through model and view-projection matrices\n@vertex\nfn vs_main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let world_pos = model.model_matrix * vec4<f32>(input.position, 1.0);\n output.clip_position = camera.view_projection * world_pos;\n output.normal = normalize((model.normal_matrix * vec4<f32>(input.normal, 0.0)).xyz);\n return output;\n}\n\n// Fragment shader - simple shading based on normal direction for visual feedback\n@fragment\nfn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {\n // Use normal-based shading so geometry is visible (half-Lambert)\n let light_dir = normalize(vec3<f32>(0.5, 1.0, 0.3));\n let ndotl = max(dot(input.normal, light_dir), 0.0);\n let ambient = 0.15;\n let brightness = ambient + ndotl * 0.85;\n let base = vec3<f32>(brightness, brightness, brightness);\n return vec4<f32>(base * material.base_color.rgb, material.base_color.a);\n}";Expand description
Simple unlit shader for vertex-colored objects.
Outputs interpolated vertex colors directly without any lighting calculations. Useful for debug visualization and UI elements.