From 1ecd1c74037301ba7ad9d7e38007f2ac01b472a7 Mon Sep 17 00:00:00 2001 From: zomseffen <steffen@tom.bi> Date: Mon, 3 Feb 2025 12:42:56 +0100 Subject: [PATCH] transparent roughness and diffuse settings from app --- shaders/compiled/frag_rt_quad.spv | Bin 34756 -> 35760 bytes shaders/rt_quad.frag | 15 +++++++++++---- src/app_data.rs | 3 +++ src/main.rs | 2 ++ src/primitives/cube.rs | 1 + src/scene/empty_volume.rs | 24 +++++++++++++----------- src/scene/mod.rs | 11 +++++++++-- 7 files changed, 39 insertions(+), 17 deletions(-) diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv index e1575e854c99b1fb935dd51fda5fda786faed2e1..2c447ea3efa6d8e55313f6618b2a6979a15f5362 100644 GIT binary patch delta 7817 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 CY_~E1 delta 6728 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 RKo50#=Ih}WLz|^O{}1^PAsYYy diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag index e9baaa8..82944b5 100644 --- a/shaders/rt_quad.frag +++ b/shaders/rt_quad.frag @@ -16,6 +16,10 @@ layout(binding = 0) uniform UniformBufferObject { bool[16] use_geom_shader; } ubo; +// 0 - location for the maximum number of lights referenced per chunk (also will be the invalid memory allocation for pointing to a nonexistant neighbor) +// 1 - location for the max iterations per light +// 2 - diffuse raster samples (2*n + 1) * (2*n + 1) so as to always have at least the central fragment covered +// 3 - diffuse raster size (float, needs to be decoded) layout(binding = 2) buffer SceneInfoBuffer{ uint infos[]; } scene_info; @@ -350,8 +354,8 @@ vec3 diffuse_tracing(uint volume_start, uvec2 raster_pos, vec3 pos, uint f) { vec3 normal = normal_for_facing(f); // diffuse raytracing using a quadratic raster of rays - int raster_half_steps = 0; - float raster_distance = 0.01; + int raster_half_steps = int(scene_info.infos[2]); + float raster_distance = uintBitsToFloat(scene_info.infos[3]); int raster_points = (2 * raster_half_steps + 1) * (2 * raster_half_steps + 1); vec3 color_sum = vec3(0.0, 0.0, 0.0); @@ -389,18 +393,21 @@ vec3 clamp_to_volume(uint volume_start, vec3 position) { void main() { vec3 clamped_pos = clamp_to_volume(fragVolumeStart, origPosition); + uvec4 color_roughness = sample_color_from_scene_info(fragVolumeStart, fragRasterPos, facing); + vec3 orig_color_sample = vec3(float(color_roughness.x) / 255.0, float(color_roughness.y) / 255.0, float(color_roughness.z) / 255.0); vec3 color_sum = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); uint orig_neighbor = sample_neighbor_from_scene_info(fragVolumeStart, fragRasterPos, facing); if (orig_neighbor != 0) { float pos_infinity = uintBitsToFloat(0x7F800000); Tracing t = trace_ray(fragVolumeStart, ubo.camera_pos, clamped_pos - ubo.camera_pos, 100.0, 0, 20); + float opacity = float(color_roughness.w) / 255.0; if (t.has_hit) { - color_sum += diffuse_tracing(t.end_volume, t.end_raster, t.end_pos, t.end_facing); + color_sum = opacity * color_sum + (1.0 - opacity) * diffuse_tracing(t.end_volume, t.end_raster, t.end_pos, t.end_facing) * orig_color_sample; } else { // Todo: hit sky box - color_sum += vec3(0.0, 0.0, 0.0); + color_sum = opacity * color_sum + (1.0 - opacity) * vec3(0.0, 0.0, 0.0); } } diff --git a/src/app_data.rs b/src/app_data.rs index 91d507a..2464a26 100644 --- a/src/app_data.rs +++ b/src/app_data.rs @@ -60,6 +60,9 @@ pub struct AppData { pub topology: vk::PrimitiveTopology, pub scene_rt_memory_size: u64, + // values passed to shader pub num_lights_per_volume: u32, pub max_iterations_per_light: u32, + pub diffuse_raster_steps: u32, + pub diffuse_raster_size: f32, } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 2e8d209..2ac22ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,6 +180,8 @@ impl App { data.use_geometry_shader = false; data.num_lights_per_volume = 2; data.max_iterations_per_light = 20; + data.diffuse_raster_steps = 2; + data.diffuse_raster_size = 0.01; let mut scene_handler = scene::Scene::default(); //load_model::load_model(&mut data)?; diff --git a/src/primitives/cube.rs b/src/primitives/cube.rs index 31a760e..6f7371d 100644 --- a/src/primitives/cube.rs +++ b/src/primitives/cube.rs @@ -10,6 +10,7 @@ pub struct Cube{ pub color: vertex::Vec3, pub tex_coord: vertex::Vec2, pub transparent: bool, + pub roughness: u8, } const CUBE_SIZE: f32 = 0.5; diff --git a/src/scene/empty_volume.rs b/src/scene/empty_volume.rs index 7581195..1357e0a 100644 --- a/src/scene/empty_volume.rs +++ b/src/scene/empty_volume.rs @@ -50,9 +50,9 @@ impl EmptyVolume { self.position[2] + self.size_z > pos[2] && pos[2] >= self.position[2] } - fn check_transparent(cube_result: Option<Cube>, transparent_color: &Vector3<f32>) -> bool { + fn check_transparent(cube_result: Option<Cube>, transparent_color: &Vector3<f32>, transparent_roughness: &u8) -> bool { if let Some(c) = cube_result { - return c.transparent && &c.color == transparent_color + return c.transparent && &c.color == transparent_color && &c.roughness == transparent_roughness } false } @@ -73,9 +73,11 @@ impl EmptyVolume { let query_result = tree.test_element(x_index, y_index, z_index); let mut transparent = false; let mut transparent_color = Vector3 {x: 0.0, y: 0.0, z: 0.0}; + let mut tranparent_roughness = 0; if let Some(c) = query_result.3 { transparent = c.transparent; transparent_color = c.color; + tranparent_roughness = c.roughness; } if !query_result.0 || transparent { @@ -112,7 +114,7 @@ impl EmptyVolume { while z < z_size.max(1) && y < y_size.max(1) { let query_result = tree.test_element(x_index + x_size + 1, y_index + y, z_index + z); check_its += 1; - grow &= ((!query_result.0 && !transparent) || (transparent && EmptyVolume::check_transparent(query_result.3, &transparent_color))) && + grow &= ((!query_result.0 && !transparent) || (transparent && EmptyVolume::check_transparent(query_result.3, &transparent_color, &tranparent_roughness))) && neighbors.get_element(x_index + x_size + 1, y_index + y, z_index + z).is_none(); if query_result.1 > 1 { @@ -159,7 +161,7 @@ impl EmptyVolume { while z < z_size.max(1) && x < x_size.max(1) { let query_result = tree.test_element(x_index + x, y_index + y_size + 1, z_index + z); check_its += 1; - grow &= ((!query_result.0 && !transparent) || (transparent && EmptyVolume::check_transparent(query_result.3, &transparent_color))) && + grow &= ((!query_result.0 && !transparent) || (transparent && EmptyVolume::check_transparent(query_result.3, &transparent_color, &tranparent_roughness))) && neighbors.get_element(x_index + x, y_index + y_size + 1, z_index + z).is_none(); if query_result.1 > 1 { @@ -207,7 +209,7 @@ impl EmptyVolume { while y < y_size.max(1) && x < x_size.max(1) { let query_result = tree.test_element(x_index + x, y_index + y, z_index + z_size + 1); check_its += 1; - grow &= ((!query_result.0 && !transparent) || (transparent && EmptyVolume::check_transparent(query_result.3, &transparent_color))) && + grow &= ((!query_result.0 && !transparent) || (transparent && EmptyVolume::check_transparent(query_result.3, &transparent_color, &tranparent_roughness))) && neighbors.get_element(x_index + x, y_index + y, z_index + z_size + 1).is_none(); if query_result.1 > 1 { @@ -323,7 +325,7 @@ impl EmptyVolume { bottom_elements_num += 1; let u8_color = Vector3 {x: (c.color * 255.0).x.min(255.0).max(0.0) as u8, y: (c.color * 255.0).y.min(255.0).max(0.0) as u8, z: (c.color * 255.0).z.min(255.0).max(0.0) as u8}; bottom_colors.push(u8_color); - bottom_roughness.push(128); + bottom_roughness.push(c.roughness); } else { bottom_colors.push(Vector3 { x: 0, y: 0, z: 0 }); @@ -349,7 +351,7 @@ impl EmptyVolume { top_elements_num += 1; let u8_color = Vector3 {x: (c.color * 255.0).x.min(255.0).max(0.0) as u8, y: (c.color * 255.0).y.min(255.0).max(0.0) as u8, z: (c.color * 255.0).z.min(255.0).max(0.0) as u8}; top_colors.push(u8_color); - top_roughness.push(128); + top_roughness.push(c.roughness); } else { top_colors.push(Vector3 { x: 0, y: 0, z: 0 }); @@ -376,7 +378,7 @@ impl EmptyVolume { back_elements_num += 1; let u8_color = Vector3 {x: (c.color * 255.0).x.min(255.0).max(0.0) as u8, y: (c.color * 255.0).y.min(255.0).max(0.0) as u8, z: (c.color * 255.0).z.min(255.0).max(0.0) as u8}; back_colors.push(u8_color); - back_roughness.push(128); + back_roughness.push(c.roughness); } else { back_colors.push(Vector3 { x: 0, y: 0, z: 0 }); @@ -403,7 +405,7 @@ impl EmptyVolume { front_elements_num += 1; let u8_color = Vector3 {x: (c.color * 255.0).x.min(255.0).max(0.0) as u8, y: (c.color * 255.0).y.min(255.0).max(0.0) as u8, z: (c.color * 255.0).z.min(255.0).max(0.0) as u8}; front_colors.push(u8_color); - front_roughness.push(128); + front_roughness.push(c.roughness); } else { front_colors.push(Vector3 { x: 0, y: 0, z: 0 }); @@ -430,7 +432,7 @@ impl EmptyVolume { left_elements_num += 1; let u8_color = Vector3 {x: (c.color * 255.0).x.min(255.0).max(0.0) as u8, y: (c.color * 255.0).y.min(255.0).max(0.0) as u8, z: (c.color * 255.0).z.min(255.0).max(0.0) as u8}; left_colors.push(u8_color); - left_roughness.push(128); + left_roughness.push(c.roughness); } else { left_colors.push(Vector3 { x: 0, y: 0, z: 0 }); @@ -457,7 +459,7 @@ impl EmptyVolume { right_elements_num += 1; let u8_color = Vector3 {x: (c.color * 255.0).x.min(255.0).max(0.0) as u8, y: (c.color * 255.0).y.min(255.0).max(0.0) as u8, z: (c.color * 255.0).z.min(255.0).max(0.0) as u8}; right_colors.push(u8_color); - right_roughness.push(128); + right_roughness.push(c.roughness); } else { right_colors.push(Vector3 { x: 0, y: 0, z: 0 }); diff --git a/src/scene/mod.rs b/src/scene/mod.rs index c5703a7..0ed0efb 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -73,6 +73,7 @@ impl Scene { color: vec3(shade, 1.0, shade), tex_coord: vec2(0.0, 0.0), transparent: false, + roughness: 128, }; oct_tree.set_cube(cube.clone()); @@ -85,6 +86,7 @@ impl Scene { color: vec3(1.0, 0.0, 0.0), tex_coord: vec2(0.0, 0.0), transparent: true, + roughness: 32, }; oct_tree.set_cube(cube.clone()); @@ -93,10 +95,11 @@ impl Scene { color: vec3(1.0, 0.0, 0.0), tex_coord: vec2(0.0, 0.0), transparent: true, + roughness: 32, }; oct_tree.set_cube(cube.clone()); - self.point_lights.push(PointLight { pos: vec3(11.0, 11.0, 11.0), color: vec3(0.5, 0.5, 0.5), memory_start: 0 }); + self.point_lights.push(PointLight { pos: vec3(11.0, 11.0, 11.0), color: vec3(1.0, 1.0, 1.0), memory_start: 0 }); self.point_lights.push(PointLight { pos: vec3(9.0, 9.0, 11.0), color: vec3(0.5, 0.5, 0.5), memory_start: 0 }); let empty_volumes: Vec<Rc<RefCell<EmptyVolume>>>; @@ -146,9 +149,11 @@ impl Scene { let index = self.sized_vertices.len(); cube.draw(&data.topology, index, self); - let mut memory_index = 2; + let mut memory_index = 4; // 0 - location for the maximum number of lights referenced per chunk (also will be the invalid memory allocation for pointing to a nonexistant neighbor) // 1 - location for the max iterations per light + // 2 - diffuse raster samples (2*n + 1) * (2*n + 1) so as to always have at least the central fragment covered + // 3 - diffuse raster size for light in &mut self.point_lights { light.memory_start = memory_index; memory_index += light.get_buffer_mem_size() as usize; @@ -168,6 +173,8 @@ impl Scene { println!("Memory size is {} kB, max indes is {}", memory_index * 32 / 8 /1024 + 1, memory_index); let mut volume_vec = vec![data.num_lights_per_volume; memory_index]; volume_vec[1] = data.max_iterations_per_light; + volume_vec[2] = data.diffuse_raster_steps; + volume_vec[3] = u32::from_ne_bytes(data.diffuse_raster_size.to_ne_bytes()); for volume in &empty_volumes { volume_vec = volume.borrow().insert_into_memory(volume_vec, data.num_lights_per_volume, &self.point_lights);