From 353a7e78fc26233d66fa1d92c7dc8eb5233e125f Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Tue, 27 Aug 2024 12:42:32 +0300 Subject: [PATCH] switch to enable/disable occlusion culling --- fyrox-impl/src/renderer/gbuffer/mod.rs | 47 +++++++++++++++----------- fyrox-impl/src/renderer/mod.rs | 11 +++++- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/fyrox-impl/src/renderer/gbuffer/mod.rs b/fyrox-impl/src/renderer/gbuffer/mod.rs index a8bc20c43..6c9f471b3 100644 --- a/fyrox-impl/src/renderer/gbuffer/mod.rs +++ b/fyrox-impl/src/renderer/gbuffer/mod.rs @@ -31,6 +31,7 @@ use crate::renderer::debug_renderer::DebugRenderer; use crate::renderer::visibility::OcclusionTester; +use crate::renderer::QualitySettings; use crate::{ core::{ algebra::{Matrix4, Vector2}, @@ -95,7 +96,7 @@ pub(crate) struct GBufferRenderContext<'a, 'b> { pub normal_dummy: Rc>, pub black_dummy: Rc>, pub volume_dummy: Rc>, - pub use_parallax_mapping: bool, + pub quality_settings: &'a QualitySettings, pub graph: &'b Graph, pub matrix_storage: &'a mut MatrixStorageCache, #[allow(dead_code)] @@ -299,7 +300,7 @@ impl GBuffer { bundle_storage, texture_cache, shader_cache, - use_parallax_mapping, + quality_settings, white_dummy, normal_dummy, black_dummy, @@ -312,23 +313,27 @@ impl GBuffer { let initial_view_projection = camera.view_projection_matrix(); - let mut objects = FxHashSet::default(); - for bundle in bundle_storage.bundles.iter() { - for instance in bundle.instances.iter() { - objects.insert(instance.node_handle); + let visibility = if quality_settings.use_occlusion_culling { + let mut objects = FxHashSet::default(); + for bundle in bundle_storage.bundles.iter() { + for instance in bundle.instances.iter() { + objects.insert(instance.node_handle); + } } - } - let objects = objects.into_iter().collect::>(); - let visibility = self.occlusion_tester.check( - camera.global_position(), - &initial_view_projection, - state, - &self.framebuffer, - graph, - &objects, - None, - unit_quad, - )?; + let objects = objects.into_iter().collect::>(); + self.occlusion_tester.check( + camera.global_position(), + &initial_view_projection, + state, + &self.framebuffer, + graph, + &objects, + None, + unit_quad, + )? + } else { + Default::default() + }; let viewport = Rect::new(0, 0, self.width, self.height); self.framebuffer.clear( @@ -374,7 +379,9 @@ impl GBuffer { }; for instance in bundle.instances.iter() { - if !visibility.get(&instance.node_handle).map_or(true, |v| *v) { + if quality_settings.use_occlusion_culling + && !visibility.get(&instance.node_handle).map_or(true, |v| *v) + { continue; } @@ -401,7 +408,7 @@ impl GBuffer { camera_up_vector: &camera_up, camera_side_vector: &camera_side, z_near: camera.projection().z_near(), - use_pom: use_parallax_mapping, + use_pom: quality_settings.use_parallax_mapping, light_position: &Default::default(), blend_shapes_storage: blend_shapes_storage.as_ref(), blend_shapes_weights: &instance.blend_shapes_weights, diff --git a/fyrox-impl/src/renderer/mod.rs b/fyrox-impl/src/renderer/mod.rs index 8514adf1a..cb685e6ed 100644 --- a/fyrox-impl/src/renderer/mod.rs +++ b/fyrox-impl/src/renderer/mod.rs @@ -254,6 +254,11 @@ pub struct QualitySettings { /// Whether to use bloom effect. pub use_bloom: bool, + + /// Whether to use occlusion culling technique or not. Warning: this is experimental feature + /// that wasn't properly tested yet! + #[serde(default)] + pub use_occlusion_culling: bool, } impl Default for QualitySettings { @@ -290,6 +295,7 @@ impl QualitySettings { use_bloom: true, + use_occlusion_culling: false, use_parallax_mapping: true, csm_settings: Default::default(), @@ -323,6 +329,7 @@ impl QualitySettings { use_bloom: true, + use_occlusion_culling: false, use_parallax_mapping: true, csm_settings: CsmSettings { @@ -361,6 +368,7 @@ impl QualitySettings { use_bloom: true, + use_occlusion_culling: false, use_parallax_mapping: false, csm_settings: CsmSettings { @@ -399,6 +407,7 @@ impl QualitySettings { use_bloom: false, + use_occlusion_culling: false, use_parallax_mapping: false, csm_settings: CsmSettings { @@ -1661,7 +1670,7 @@ impl Renderer { bundle_storage: &bundle_storage, texture_cache: &mut self.texture_cache, shader_cache: &mut self.shader_cache, - use_parallax_mapping: self.quality_settings.use_parallax_mapping, + quality_settings: &self.quality_settings, normal_dummy: self.normal_dummy.clone(), white_dummy: self.white_dummy.clone(), black_dummy: self.black_dummy.clone(),