From 6f0e3ab194c622d119eb23e030c274dedbaf5a3e Mon Sep 17 00:00:00 2001 From: stainlu Date: Mon, 6 Apr 2026 19:47:23 +0800 Subject: [PATCH] Enable SSR, DoF, and volumetric fog in MOBA demo Upgrade render quality from Medium to High to enable SSGI, motion blur, and DoF by default. Explicitly enable SSR and set the DoF focal distance to 40 units to match the MOBA camera height. Initialize volumetric fog on the renderer with subtle density (0.01) so it reads as atmosphere without obstructing gameplay. SSAO remains disabled due to known diamond artifacts on flat terrain. Co-Authored-By: Claude Opus 4.6 (1M context) --- examples/dota_client.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/examples/dota_client.rs b/examples/dota_client.rs index 2cec685..757df46 100644 --- a/examples/dota_client.rs +++ b/examples/dota_client.rs @@ -1142,9 +1142,13 @@ impl DotaClientApp { width: WINDOW_WIDTH as f32, height: WINDOW_HEIGHT as f32, }); - // Use Medium quality but disable SSAO (causes diamond artifacts on flat terrain) - let mut pps = euca_render::RenderQuality::Medium.to_settings(); + // Use High quality with SSR and DoF enabled, but disable SSAO + // (causes diamond artifacts on flat terrain). + let mut pps = euca_render::RenderQuality::High.to_settings(); pps.ssao_enabled = false; + pps.ssr_enabled = true; + // Focal distance matches the MOBA camera height (~40 world units). + pps.dof.focus_distance = 40.0; world.insert_resource(pps); // Register items and heroes @@ -3987,6 +3991,19 @@ impl ApplicationHandler for DotaClientApp { self.renderer.as_mut().unwrap(), ); + // Enable volumetric fog for atmospheric MOBA visuals (subtle density + // so it reads as atmosphere rather than obstructing gameplay). + { + let gpu = self.gpu.as_ref().unwrap(); + let renderer = self.renderer.as_mut().unwrap(); + renderer.enable_volumetric_fog(gpu); + renderer.set_fog_settings(euca_render::VolumetricFogSettings { + density: 0.01, + scattering: 0.3, + ..Default::default() + }); + } + // Kick off the render loop — Metal backend replaces winit's layer, // so the initial RedrawRequested may not arrive automatically. self.gpu.as_ref().unwrap().window.request_redraw();