diff --git a/simulator/src/main.rs b/simulator/src/main.rs index c2e9506..c0434eb 100644 --- a/simulator/src/main.rs +++ b/simulator/src/main.rs @@ -66,23 +66,26 @@ pub async fn run() { state.light_manager.add_light(Light::new_point( sun_pos.cast::().unwrap(), Vector3::from([1.0, 1.0, 0.8]), - 5.0, + 1.0, 1.0 / 1000.0, )); let sun_material = GpuMaterial::new( [1.0, 1.0, 0.0, 1.0], - [2.0, 2.0, 1.0], + [1.0, 1.0, 0.01], + 5.0, ); let earth_material = GpuMaterial::new( [0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 0.0], + 1.0 ); let default_material = GpuMaterial::new( [0.5, 0.5, 0.5, 1.0], [0.0, 0.0, 0.0], + 1.0 ); state.set_materials(vec![ diff --git a/solar_engine/src/material_manager.rs b/solar_engine/src/material_manager.rs index 67aae9a..6ac81c4 100644 --- a/solar_engine/src/material_manager.rs +++ b/solar_engine/src/material_manager.rs @@ -6,15 +6,15 @@ use wgpu::util::DeviceExt; pub struct GpuMaterial { pub base_color: [f32; 4], pub emission: [f32; 3], - _pad: f32, + pub emissive_strength: f32, } impl GpuMaterial { - pub fn new(base_color: [f32; 4], emission: [f32; 3]) -> Self { + pub fn new(base_color: [f32; 4], emission: [f32; 3], emissive_strength: f32) -> Self { Self { base_color, emission, - _pad: 0.0, + emissive_strength, } } } @@ -48,7 +48,7 @@ impl MaterialManager { GpuMaterial { base_color: [1.0, 1.0, 1.0, 1.0], emission: [0.0, 0.0, 0.0], - _pad: 0.0, + emissive_strength: 0.0, }, ]; diff --git a/solar_engine/src/shaders/shader.wgsl b/solar_engine/src/shaders/shader.wgsl index ae749bb..8d9d4b6 100644 --- a/solar_engine/src/shaders/shader.wgsl +++ b/solar_engine/src/shaders/shader.wgsl @@ -59,7 +59,8 @@ var cluster_offsets: array>; struct GpuMaterial { base_color: vec4, - emission: vec3 + emission: vec3, + emissive_strength: f32, }; @group(3) @binding(0) @@ -106,6 +107,11 @@ fn compute_cluster_id(frag_coord: vec4, view_pos_z: f32, screen_size: vec2< return x + y * CLUSTER_COUNT_X + z * CLUSTER_COUNT_X * CLUSTER_COUNT_Y; } +// Thanks Reinhard +fn tone_map(color: vec3) -> vec3 { + return color / (color + vec3(1.0)); +} + @fragment fn fs_main(input: VSOutput) -> @location(0) vec4 { let material = materials[input.material_id]; @@ -151,6 +157,7 @@ fn fs_main(input: VSOutput) -> @location(0) vec4 { lighting += light_contrib; } - let final_rgb = material.base_color.rgb * lighting + material.emission; + let emissive_rgb = material.emission * material.emissive_strength; + let final_rgb = tone_map(material.base_color.rgb * lighting + emissive_rgb); return vec4(final_rgb, material.base_color.a); }