From 1a30887a7dc2bad9fb3f0a417d90d2e31ea01b7c Mon Sep 17 00:00:00 2001 From: zomseffen <steffen@tom.bi> Date: Fri, 28 Feb 2025 14:06:20 +0100 Subject: [PATCH] clamp to quad --- shaders/compiled/frag_rt_quad.spv | Bin 46376 -> 46712 bytes shaders/compiled/vert_rt_quad.spv | Bin 2892 -> 3228 bytes shaders/rt_quad.frag | 32 +++++++++++++++++++----------- shaders/rt_quad.vert | 8 ++++++++ src/primitives/quad.rs | 16 +++++++++++---- src/scene/generators.rs | 2 +- src/vertex.rs | 26 +++++++++++++++++++----- 7 files changed, 62 insertions(+), 22 deletions(-) diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv index 18213c1a8337e560ddc049edd5ff12fdc4a09b2d..216c16163e7f1d0cc4d8c28b80cc265169eb0e96 100644 GIT binary patch delta 7770 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 ASO5S3 delta 7410 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 FF9NPwWL*FN diff --git a/shaders/compiled/vert_rt_quad.spv b/shaders/compiled/vert_rt_quad.spv index 64d060ce38083553631a6f3cb5cd06594268ba69..2dbe2575789335b429815af250e1dd0b61ce52df 100644 GIT binary patch delta 379 zcmX>jHb;_|nMs+Qfq{{Mn}L@haU!oNqtHZWQ{HF>28I|QjsxQOjiug9ajXn%3?R|m z%)Fq);*!*&fc#=0mjNUWQkj|Oiy{LO2kFjDtiVto4^fXKvw0tr6;r4?12fnTKA^li z0}Gff2V}EA`5=1`d}gruFts4NKys{5wIDmd{LNokE;D&501b%(3NZt*7Z6)R`5-TW z#6Wy+APusD5y}Ut2N{bjAHVq^do#0xEl@egm{=eNX|aR49K?soB>>qVSAgU|#(?;L JfreWEF#yNPG$;T7 delta 54 zcmbOuc}9$vnMs+Qfq{{Mn}L@hY9g;GBi}@4(~TV-Oq&guEtobRV7<V!`2j}_Gsj<` IA`2h}06t?3cmMzZ diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag index d5747b9..2e2a32a 100644 --- a/shaders/rt_quad.frag +++ b/shaders/rt_quad.frag @@ -4,6 +4,8 @@ layout(location = 0) in vec2 fragRasterPos; layout(location = 1) flat in uint fragVolumeStart; layout(location = 2) in vec3 origPosition; layout(location = 3) flat in uint facing; +layout(location = 4) flat in uvec2 minRasterPos; +layout(location = 5) flat in uvec2 maxRasterPos; layout(location = 0) out vec4 outColor; @@ -468,15 +470,21 @@ vec3 clamp_to_volume(uint volume_start, vec3 position) { return vec3(min(max(position.x, low_x_border), high_x_border), min(max(position.y, low_y_border), high_y_border), min(max(position.z, low_z_border), high_z_border)); } -vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4 color_sample, vec3 color_sum) { - vec3 orig_color_sample = vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0); +vec2 clamp_to_quad(vec2 raster_pos, uvec2 min_raster_pos, uvec2 max_raster_pos) { + return vec2(max(min_raster_pos.x, min(max_raster_pos.x - 1, raster_pos.x)), max(min_raster_pos.y, min(max_raster_pos.y - 1, raster_pos.y))); +} - vec3 reflection_direction = reflect_vector(view_vector, f); - Tracing reflection_tracing = trace_ray(volume_start, pos, reflection_direction, pos_infinity, 0, max_iterations_per_light, true); +vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4 color_sample, vec3 color_sum) { float reflectivity = 1.0 - float(color_sample.w) / 255.0; - if (reflection_tracing.has_hit || reflection_tracing.has_transparent_hit) { - vec3 color_from_reflection = diffuse_tracing(reflection_tracing.end_volume, reflection_tracing.end_raster, reflection_tracing.end_pos, reflection_tracing.end_facing) * orig_color_sample; - color_sum = color_sum * (1.0 - reflectivity) + color_from_reflection * reflectivity; + + if (reflectivity > 0.01) { + vec3 orig_color_sample = vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0); + vec3 reflection_direction = reflect_vector(view_vector, f); + Tracing reflection_tracing = trace_ray(volume_start, pos, reflection_direction, pos_infinity, 0, max_iterations_per_light, true); + if (reflection_tracing.has_hit || reflection_tracing.has_transparent_hit) { + vec3 color_from_reflection = diffuse_tracing(reflection_tracing.end_volume, reflection_tracing.end_raster, reflection_tracing.end_pos, reflection_tracing.end_facing) * orig_color_sample; + color_sum = color_sum * (1.0 - reflectivity) + color_from_reflection * reflectivity; + } } return color_sum; @@ -484,13 +492,14 @@ vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4 void main() { vec3 clamped_pos = clamp_to_volume(fragVolumeStart, origPosition); - uvec4 color_roughness = sample_color_from_scene_info(fragVolumeStart, fragRasterPos, facing); + vec2 clamped_raster_pos = clamp_to_quad(fragRasterPos, minRasterPos, maxRasterPos); + uvec4 color_roughness = sample_color_from_scene_info(fragVolumeStart, clamped_raster_pos, 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; - uint orig_neighbor = sample_neighbor_from_scene_info(fragVolumeStart, fragRasterPos, facing); + uint orig_neighbor = sample_neighbor_from_scene_info(fragVolumeStart, clamped_raster_pos, facing); if (orig_neighbor != 0) { - vec3 color_direct = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); + vec3 color_direct = diffuse_tracing(fragVolumeStart, clamped_raster_pos, clamped_pos, facing); color_direct = add_reflection(normalize(clamped_pos - ubo.camera_pos), facing, fragVolumeStart, clamped_pos, color_roughness, color_direct); Tracing t = trace_ray(fragVolumeStart, ubo.camera_pos, clamped_pos - ubo.camera_pos, pos_infinity, 0, max_iterations_per_light, false); @@ -507,11 +516,10 @@ void main() { } } else { - color_sum = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); + color_sum = diffuse_tracing(fragVolumeStart, clamped_raster_pos, clamped_pos, facing); color_sum = add_reflection(normalize(clamped_pos - ubo.camera_pos), facing, fragVolumeStart, clamped_pos, color_roughness, color_sum); } outColor = vec4(color_sum, 1.0); - //outColor = vec4(orig_color_sample, 1.0); } \ No newline at end of file diff --git a/shaders/rt_quad.vert b/shaders/rt_quad.vert index d43d6e1..b5e9b2b 100644 --- a/shaders/rt_quad.vert +++ b/shaders/rt_quad.vert @@ -14,12 +14,17 @@ layout(location = 0) in vec3 inPosition; layout(location = 1) in uvec2 inRasterPos; layout(location = 2) in uint inVolumeStart; layout(location = 3) in uint inFacing; +layout(location = 4) in uvec2 inMinRasterPos; +layout(location = 5) in uvec2 inMaxRasterPos; layout(location = 0) out vec2 rasterPos; layout(location = 1) flat out uint volumeStart; layout(location = 2) out vec3 origPosition; layout(location = 3) flat out uint facing; +layout(location = 4) flat out uvec2 minRasterPos; +layout(location = 5) flat out uvec2 maxRasterPos; + void main() { if (ubo.use_geom_shader[0]) { gl_Position = ubo.geom_rot * ubo.model * vec4(inPosition, 1.0); @@ -30,4 +35,7 @@ void main() { volumeStart = inVolumeStart; origPosition = inPosition; facing = inFacing; + + minRasterPos = inMinRasterPos; + maxRasterPos = inMaxRasterPos; } \ No newline at end of file diff --git a/src/primitives/quad.rs b/src/primitives/quad.rs index b055edb..a6926d1 100644 --- a/src/primitives/quad.rs +++ b/src/primitives/quad.rs @@ -24,28 +24,36 @@ impl Drawable for Quad { vec3(self.pos1.x as f32, self.pos1.y as f32, self.pos1.z as f32), self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 0, y: 0}), self.volume_index, - self.facing + self.facing, + self.raster_pos, + self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}), )); // 1 top right far scene.rt_vertices.push(vertex::RTVertex::new( vec3(self.pos2.x as f32, self.pos2.y as f32, self.pos2.z as f32), self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 0, y: 1}), self.volume_index, - self.facing + self.facing, + self.raster_pos, + self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}), )); // 2 top left near scene.rt_vertices.push(vertex::RTVertex::new( vec3(self.pos3.x as f32, self.pos3.y as f32, self.pos3.z as f32), self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}), self.volume_index, - self.facing + self.facing, + self.raster_pos, + self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}), )); // 3 top right near scene.rt_vertices.push(vertex::RTVertex::new( vec3(self.pos4.x as f32, self.pos4.y as f32, self.pos4.z as f32), self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 0}), self.volume_index, - self.facing + self.facing, + self.raster_pos, + self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}), )); // change node order while preserving texture coordinates diff --git a/src/scene/generators.rs b/src/scene/generators.rs index 78c629e..3b3a6fa 100644 --- a/src/scene/generators.rs +++ b/src/scene/generators.rs @@ -215,5 +215,5 @@ pub fn generate_test_scene2(scene: &mut Scene, data: &mut AppData, chunk_num_x: scene.directional_lights.push(Rc::new(RefCell::new(DirectionalLight { direction: vec3(0.0, 0.0, -1.0), color: vec3(0.1, 0.1, 0.1), memory_start: 0 }))); scene.oct_trees = oct_trees; - Ok(cgmath::point3((max_x as f32 / 2.0) as f32, (max_y as f32 / 2.0) as f32, height_map[(max_x as f32 / 2.0).floor() as usize][(max_y as f32 / 2.0).floor() as usize] + 2.0)) + Ok(cgmath::point3((max_x as f32 / 2.0) as f32, (max_y as f32 / 2.0) as f32, height_map[(max_x as f32 / 2.0).floor() as usize][(max_y as f32 / 2.0).floor() as usize] + 2000.0)) } \ No newline at end of file diff --git a/src/vertex.rs b/src/vertex.rs index 3d5c6e7..90cead4 100644 --- a/src/vertex.rs +++ b/src/vertex.rs @@ -181,14 +181,16 @@ pub struct RTVertex { pub raster_pos: cgmath::Vector2<u32>, pub volume_start: u32, facing: Facing, + min_raster_pos: cgmath::Vector2<u32>, + max_raster_pos: cgmath::Vector2<u32>, } impl RTVertex { - pub const fn new(pos: Vec3, raster_pos: cgmath::Vector2<u32>, volume_start: u32, facing: Facing) -> Self { - Self { pos, raster_pos, volume_start, facing } + pub const fn new(pos: Vec3, raster_pos: cgmath::Vector2<u32>, volume_start: u32, facing: Facing, min_raster_pos: cgmath::Vector2<u32>, max_raster_pos: cgmath::Vector2<u32>) -> Self { + Self { pos, raster_pos, volume_start, facing, min_raster_pos, max_raster_pos } } } -impl VertexContainer<4> for RTVertex { +impl VertexContainer<6> for RTVertex { fn binding_description() -> vk::VertexInputBindingDescription { vk::VertexInputBindingDescription::builder() .binding(0) @@ -197,7 +199,7 @@ impl VertexContainer<4> for RTVertex { .build() } - fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 4] { + fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 6] { let pos = vk::VertexInputAttributeDescription::builder() .binding(0) .location(0) @@ -226,7 +228,21 @@ impl VertexContainer<4> for RTVertex { .offset((size_of::<Vec3>() + size_of::<cgmath::Vector2<u32>>() + size_of::<u32>()) as u32) .build(); - [pos, raster_pos, volume_start, facing] + let min_raster_pos = vk::VertexInputAttributeDescription::builder() + .binding(0) + .location(4) + .format(vk::Format::R32G32_UINT) + .offset((size_of::<Vec3>() + size_of::<cgmath::Vector2<u32>>() + size_of::<u32>() + size_of::<u32>()) as u32) + .build(); + + let max_raster_pos = vk::VertexInputAttributeDescription::builder() + .binding(0) + .location(5) + .format(vk::Format::R32G32_UINT) + .offset((size_of::<Vec3>() + size_of::<cgmath::Vector2<u32>>() + size_of::<u32>() + size_of::<u32>() + size_of::<cgmath::Vector2<u32>>()) as u32) + .build(); + + [pos, raster_pos, volume_start, facing, min_raster_pos, max_raster_pos] } }