From 84ddba5814f54ce95c570dcbf63bb2b51ddde898 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Wed, 15 Jun 2022 09:51:40 +0200 Subject: [PATCH] Add DDGI injection into Volumetric Fog --- Source/Engine/Renderer/VolumetricFogPass.cpp | 35 +++++++++++++++++--- Source/Engine/Renderer/VolumetricFogPass.h | 4 ++- Source/Shaders/VolumetricFog.shader | 28 +++++++++++----- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/Source/Engine/Renderer/VolumetricFogPass.cpp b/Source/Engine/Renderer/VolumetricFogPass.cpp index 0614dd00b..6d6b804c5 100644 --- a/Source/Engine/Renderer/VolumetricFogPass.cpp +++ b/Source/Engine/Renderer/VolumetricFogPass.cpp @@ -454,12 +454,28 @@ void VolumetricFogPass::Render(RenderContext& renderContext) } } + // Init GI data + bool useDDGI = false; + DynamicDiffuseGlobalIlluminationPass::BindingData bindingDataDDGI; + if (renderContext.View.Flags & ViewFlags::GI) + { + switch (renderContext.List->Settings.GlobalIllumination.Mode) + { + case GlobalIlluminationMode::DDGI: + if (!DynamicDiffuseGlobalIlluminationPass::Instance()->Get(renderContext.Buffers, bindingDataDDGI)) + { + _cache.Data.DDGI = bindingDataDDGI.Constants; + useDDGI = true; + } + break; + } + } + // Init sky light data GPUTexture* skyLightImage = nullptr; - if (renderContext.List->SkyLights.HasItems()) + if (renderContext.List->SkyLights.HasItems() && !useDDGI) { const auto& skyLight = renderContext.List->SkyLights.Last(); - if (skyLight.VolumetricScatteringIntensity > ZeroTolerance) { _cache.Data.SkyLight.MultiplyColor = skyLight.Color; @@ -645,9 +661,20 @@ void VolumetricFogPass::Render(RenderContext& renderContext) context->BindSR(2, lightScatteringHistory ? lightScatteringHistory->ViewVolume() : nullptr); context->BindSR(3, localShadowedLightScattering); context->BindSR(4, dirLightShadowMap); - context->BindSR(5, skyLightImage); - const int32 csIndex = 0; + int32 csIndex; + if (useDDGI) + { + context->BindSR(5, bindingDataDDGI.ProbesState); + context->BindSR(6, bindingDataDDGI.ProbesDistance); + context->BindSR(7, bindingDataDDGI.ProbesIrradiance); + csIndex = 1; + } + else + { + context->BindSR(5, skyLightImage); + csIndex = 0; + } context->Dispatch(_csLightScattering.Get(csIndex), groupCountX, groupCountY, groupCountZ); context->ResetSR(); diff --git a/Source/Engine/Renderer/VolumetricFogPass.h b/Source/Engine/Renderer/VolumetricFogPass.h index d874c039c..1b4d1c7f2 100644 --- a/Source/Engine/Renderer/VolumetricFogPass.h +++ b/Source/Engine/Renderer/VolumetricFogPass.h @@ -5,6 +5,7 @@ #include "Engine/Graphics/RenderView.h" #include "Engine/Graphics/GPUPipelineStatePermutations.h" #include "RendererPass.h" +#include "GI/DynamicDiffuseGlobalIllumination.h" struct VolumetricFogOptions; struct RendererSpotLightData; @@ -64,6 +65,7 @@ private: LightData DirectionalLight; LightShadowData DirectionalLightShadow; SkyLightData SkyLight; + DynamicDiffuseGlobalIlluminationPass::ConstantsData DDGI; }); PACK_STRUCT(struct PerLight { @@ -81,7 +83,7 @@ private: // Shader stuff AssetReference _shader; GPUShaderProgramCS* _csInitialize = nullptr; - ComputeShaderPermutation<1> _csLightScattering; + ComputeShaderPermutation<2> _csLightScattering; GPUShaderProgramCS* _csFinalIntegration = nullptr; GPUPipelineStatePermutationsPs<2> _psInjectLight; diff --git a/Source/Shaders/VolumetricFog.shader b/Source/Shaders/VolumetricFog.shader index 68266b11e..90f280838 100644 --- a/Source/Shaders/VolumetricFog.shader +++ b/Source/Shaders/VolumetricFog.shader @@ -17,6 +17,7 @@ #include "./Flax/LightingCommon.hlsl" #include "./Flax/ShadowsSampling.hlsl" #include "./Flax/GBuffer.hlsl" +#include "./Flax/GI/DDGI.hlsl" struct SkyLightData { @@ -55,6 +56,7 @@ float4 FrameJitterOffsets[8]; LightData DirectionalLight; LightShadowData DirectionalLightShadow; SkyLightData SkyLight; +DDGIData DDGI; META_CB_END @@ -246,10 +248,8 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0 RWTexture3D RWVBufferA : register(u0); RWTexture3D RWVBufferB : register(u1); -#define THREADGROUP_SIZE 4 - META_CS(true, FEATURE_LEVEL_SM5) -[numthreads(THREADGROUP_SIZE, THREADGROUP_SIZE, THREADGROUP_SIZE)] +[numthreads(4, 4, 4)] void CS_Initialize(uint3 GroupId : SV_GroupID, uint3 DispatchThreadId : SV_DispatchThreadID, uint3 GroupThreadId : SV_GroupThreadID) { uint3 gridCoordinate = DispatchThreadId; @@ -285,12 +285,18 @@ Texture3D VBufferB : register(t1); Texture3D LightScatteringHistory : register(t2); Texture3D LocalShadowedLightScattering : register(t3); Texture2DArray ShadowMapCSM : register(t4); +#if USE_DDGI +Texture2D ProbesState : register(t5); +Texture2D ProbesDistance : register(t6); +Texture2D ProbesIrradiance : register(t7); +#else TextureCube SkyLightImage : register(t5); - -#define THREADGROUP_SIZE 4 +#endif META_CS(true, FEATURE_LEVEL_SM5) -[numthreads(THREADGROUP_SIZE, THREADGROUP_SIZE, THREADGROUP_SIZE)] +META_PERMUTATION_1(USE_DDGI=0) +META_PERMUTATION_1(USE_DDGI=1) +[numthreads(4, 4, 4)] void CS_LightScattering(uint3 GroupId : SV_GroupID, uint3 DispatchThreadId : SV_DispatchThreadID, uint3 GroupThreadId : SV_GroupThreadID) { uint3 gridCoordinate = DispatchThreadId; @@ -329,6 +335,11 @@ void CS_LightScattering(uint3 GroupId : SV_GroupID, uint3 DispatchThreadId : SV_ lightScattering += DirectionalLight.Color * (8 * shadow * GetPhase(PhaseG, dot(DirectionalLight.Direction, cameraVectorNormalized))); } +#if USE_DDGI + // Dynamic Diffuse Global Illumination + float3 irradiance = SampleDDGIIrradiance(DDGI, ProbesState, ProbesDistance, ProbesIrradiance, positionWS, cameraVectorNormalized, 1.0f); + lightScattering += float4(irradiance, 1); +#else // Sky light if (SkyLight.VolumetricScatteringIntensity > 0) { @@ -336,6 +347,7 @@ void CS_LightScattering(uint3 GroupId : SV_GroupID, uint3 DispatchThreadId : SV_ skyLighting = skyLighting * SkyLight.MultiplyColor + SkyLight.AdditiveColor; lightScattering += skyLighting * SkyLight.VolumetricScatteringIntensity; } +#endif } lightScattering /= (float)samplesCount; @@ -367,10 +379,8 @@ RWTexture3D RWIntegratedLightScattering : register(u0); Texture3D LightScattering : register(t0); -#define THREADGROUP_SIZE 8 - META_CS(true, FEATURE_LEVEL_SM5) -[numthreads(THREADGROUP_SIZE, THREADGROUP_SIZE, 1)] +[numthreads(8, 8, 1)] void CS_FinalIntegration(uint3 GroupId : SV_GroupID, uint3 DispatchThreadId : SV_DispatchThreadID, uint3 GroupThreadId : SV_GroupThreadID) { uint3 gridCoordinate = DispatchThreadId;