From 9cbaeb21f5bf1e79df530b05043040a3609818e7 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Mon, 20 Jun 2022 10:09:09 +0200 Subject: [PATCH] Add GI probes spacing setting --- Source/Engine/Core/Config/GraphicsSettings.cpp | 1 - Source/Engine/Core/Config/GraphicsSettings.h | 6 ++++++ Source/Engine/Graphics/Graphics.cpp | 1 - Source/Engine/Graphics/Graphics.h | 5 ----- .../Renderer/GI/DynamicDiffuseGlobalIllumination.cpp | 4 +++- Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp | 7 ++++--- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Source/Engine/Core/Config/GraphicsSettings.cpp b/Source/Engine/Core/Config/GraphicsSettings.cpp index 75f302701..d10df48d2 100644 --- a/Source/Engine/Core/Config/GraphicsSettings.cpp +++ b/Source/Engine/Core/Config/GraphicsSettings.cpp @@ -15,6 +15,5 @@ void GraphicsSettings::Apply() Graphics::AllowCSMBlending = AllowCSMBlending; Graphics::GlobalSDFQuality = GlobalSDFQuality; Graphics::GIQuality = GIQuality; - Graphics::GlobalSurfaceAtlasResolution = GlobalSurfaceAtlasResolution; Graphics::PostProcessSettings = PostProcessSettings; } diff --git a/Source/Engine/Core/Config/GraphicsSettings.h b/Source/Engine/Core/Config/GraphicsSettings.h index 920a3cc0f..2ce028c95 100644 --- a/Source/Engine/Core/Config/GraphicsSettings.h +++ b/Source/Engine/Core/Config/GraphicsSettings.h @@ -89,6 +89,12 @@ public: API_FIELD(Attributes="EditorOrder(2100), DefaultValue(Quality.High), EditorDisplay(\"Global Illumination\")") Quality GIQuality = Quality::High; + /// + /// The Global Illumination probes spacing distance (in world units). Defines the quality of the GI resolution. Adjust to 200-500 to improve performance and lower frequency GI data. + /// + API_FIELD(Attributes="EditorOrder(2120), Limit(50, 1000), EditorDisplay(\"Global Illumination\")") + float GIProbesSpacing = 100; + /// /// The Global Surface Atlas resolution. Adjust it if atlas `flickers` due to overflow (eg. to 4096). /// diff --git a/Source/Engine/Graphics/Graphics.cpp b/Source/Engine/Graphics/Graphics.cpp index 0f0a60c2f..aaa5dc2d8 100644 --- a/Source/Engine/Graphics/Graphics.cpp +++ b/Source/Engine/Graphics/Graphics.cpp @@ -16,7 +16,6 @@ Quality Graphics::ShadowMapsQuality = Quality::Medium; bool Graphics::AllowCSMBlending = false; Quality Graphics::GlobalSDFQuality = Quality::High; Quality Graphics::GIQuality = Quality::High; -int32 Graphics::GlobalSurfaceAtlasResolution = 2048; PostProcessSettings Graphics::PostProcessSettings; #if GRAPHICS_API_NULL diff --git a/Source/Engine/Graphics/Graphics.h b/Source/Engine/Graphics/Graphics.h index a1aed898c..c5933cfc1 100644 --- a/Source/Engine/Graphics/Graphics.h +++ b/Source/Engine/Graphics/Graphics.h @@ -63,11 +63,6 @@ public: /// API_FIELD() static Quality GIQuality; - /// - /// The Global Surface Atlas resolution. Adjust it if atlas `flickers` due to overflow. - /// - API_FIELD() static int32 GlobalSurfaceAtlasResolution; - /// /// The default Post Process settings. Can be overriden by PostFxVolume on a level locally, per camera or for a whole map. /// diff --git a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp index f6477592b..f4e961447 100644 --- a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp +++ b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp @@ -9,6 +9,7 @@ #include "Engine/Core/Math/Int3.h" #include "Engine/Core/Math/Matrix3x3.h" #include "Engine/Core/Math/Quaternion.h" +#include "Engine/Core/Config/GraphicsSettings.h" #include "Engine/Engine/Engine.h" #include "Engine/Content/Content.h" #include "Engine/Debug/DebugDraw.h" @@ -268,7 +269,8 @@ bool DynamicDiffuseGlobalIlluminationPass::Render(RenderContext& renderContext, // Setup options auto& settings = renderContext.List->Settings.GlobalIllumination; - const float probesSpacing = 100.0f; // GI probes placement spacing nearby camera (for closest cascade; gets automatically reduced for further cascades) + auto* graphicsSettings = GraphicsSettings::Get(); + const float probesSpacing = Math::Clamp(graphicsSettings->GIProbesSpacing, 10.0f, 1000.0f); // GI probes placement spacing nearby camera (for closest cascade; gets automatically reduced for further cascades) int32 probeRaysCount; // Amount of rays to trace randomly around each probe switch (Graphics::GIQuality) { diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp index 6951a95de..cb34dba2f 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp @@ -10,8 +10,8 @@ #include "Engine/Core/Math/OrientedBoundingBox.h" #include "Engine/Engine/Engine.h" #include "Engine/Content/Content.h" +#include "Engine/Core/Config/GraphicsSettings.h" #include "Engine/Graphics/GPUDevice.h" -#include "Engine/Graphics/Graphics.h" #include "Engine/Graphics/RenderTask.h" #include "Engine/Graphics/RenderBuffers.h" #include "Engine/Graphics/RenderTargetPool.h" @@ -345,8 +345,9 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co PROFILE_GPU_CPU("Global Surface Atlas"); // Setup options - const int32 resolution = Math::Clamp(Graphics::GlobalSurfaceAtlasResolution, 256, GPU_MAX_TEXTURE_SIZE); - const float resolutionInv = 1.0f / resolution; + auto* graphicsSettings = GraphicsSettings::Get(); + const int32 resolution = Math::Clamp(graphicsSettings->GlobalSurfaceAtlasResolution, 256, GPU_MAX_TEXTURE_SIZE); + const float resolutionInv = 1.0f / (float)resolution; auto& giSettings = renderContext.List->Settings.GlobalIllumination; const float distance = giSettings.Distance;