Finished lighting and material reimplementation
This commit is contained in:
parent
acb7c13a5f
commit
786fff5a6d
@ -66,23 +66,26 @@ pub async fn run() {
|
||||
state.light_manager.add_light(Light::new_point(
|
||||
sun_pos.cast::<f32>().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![
|
||||
|
||||
@ -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,
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@ -59,7 +59,8 @@ var<storage, read> cluster_offsets: array<vec2<u32>>;
|
||||
|
||||
struct GpuMaterial {
|
||||
base_color: vec4<f32>,
|
||||
emission: vec3<f32>
|
||||
emission: vec3<f32>,
|
||||
emissive_strength: f32,
|
||||
};
|
||||
|
||||
@group(3) @binding(0)
|
||||
@ -106,6 +107,11 @@ fn compute_cluster_id(frag_coord: vec4<f32>, 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<f32>) -> vec3<f32> {
|
||||
return color / (color + vec3<f32>(1.0));
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_main(input: VSOutput) -> @location(0) vec4<f32> {
|
||||
let material = materials[input.material_id];
|
||||
@ -151,6 +157,7 @@ fn fs_main(input: VSOutput) -> @location(0) vec4<f32> {
|
||||
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<f32>(final_rgb, material.base_color.a);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user