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);