pub const EMISSIVE_WGSL: &str = "// Emissive Material Shader\n// For self-illuminating surfaces with HDR intensity support\n\n// --- Vertex Shader ---\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\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n};\n\nstruct VertexOutput {\n @builtin(position) clip_position: vec4<f32>,\n @location(0) uv: vec2<f32>,\n};\n\nstruct ModelUniforms {\n model_matrix: mat4x4<f32>,\n};\n\n@group(1) @binding(0)\nvar<uniform> model: ModelUniforms;\n\n@vertex\nfn vs_main(input: VertexInput) -> VertexOutput {\n var out: VertexOutput;\n \n let world_pos = model.model_matrix * vec4<f32>(input.position, 1.0);\n out.clip_position = camera.view_projection * world_pos;\n out.uv = input.uv;\n \n return out;\n}\n\n\n// --- Fragment Shader ---\n\nstruct EmissiveMaterialUniforms {\n emissive_color: vec4<f32>, // RGB + padding\n intensity: f32, // HDR intensity multiplier\n _padding: vec3<f32>,\n};\n\n@group(2) @binding(0)\nvar<uniform> material: EmissiveMaterialUniforms;\n\n@fragment\nfn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {\n // Emissive materials simply output their color multiplied by intensity\n // No lighting calculations needed - they ARE the light source\n \n let emissive = material.emissive_color.rgb * material.intensity;\n \n // Simple tone mapping for HDR values\n let tone_mapped = emissive / (emissive + vec3<f32>(1.0));\n \n // Gamma correction\n let gamma_corrected = pow(tone_mapped, vec3<f32>(1.0 / 2.2));\n \n return vec4<f32>(gamma_corrected, material.emissive_color.a);\n}\n";Expand description
Emissive material shader for self-illuminating objects.
Outputs color multiplied by an intensity factor with HDR support. Includes tone mapping and gamma correction.