From e9144ff8345f2049238ba58256833af2a51a0a10 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 24 Jul 2024 12:21:50 +0200 Subject: [PATCH] Fix blending between DDGI cascades on the end of the range --- Source/Shaders/GI/DDGI.hlsl | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Source/Shaders/GI/DDGI.hlsl b/Source/Shaders/GI/DDGI.hlsl index 8b87ffea0..79ef1bea7 100644 --- a/Source/Shaders/GI/DDGI.hlsl +++ b/Source/Shaders/GI/DDGI.hlsl @@ -322,9 +322,10 @@ float3 SampleDDGIIrradiance(DDGIData data, Texture2D probesData, T // Sample cascade float3 result = SampleDDGIIrradianceCascade(data, probesData, probesDistance, probesIrradiance, worldPosition, worldNormal, cascadeIndex, probesOrigin, probesExtent, probesSpacing, biasedWorldPosition); -#if DDGI_CASCADE_BLEND_SMOOTH - // Blend with the next cascade + // Blend with the next cascade (or fallback irradiance outside the volume) cascadeIndex++; +#if DDGI_CASCADE_BLEND_SMOOTH + result *= cascadeWeight; if (cascadeIndex < data.CascadesCount && cascadeWeight < 0.99f) { probesSpacing = data.ProbesOriginAndSpacing[cascadeIndex].w; @@ -332,7 +333,16 @@ float3 SampleDDGIIrradiance(DDGIData data, Texture2D probesData, T probesExtent = (data.ProbesCounts - 1) * (probesSpacing * 0.5f); biasedWorldPosition = worldPosition + GetDDGISurfaceBias(viewDir, probesSpacing, worldNormal, bias); float3 resultNext = SampleDDGIIrradianceCascade(data, probesData, probesDistance, probesIrradiance, worldPosition, worldNormal, cascadeIndex, probesOrigin, probesExtent, probesSpacing, biasedWorldPosition); - result = lerp(resultNext, result, cascadeWeight); + result += resultNext * (1 - cascadeWeight); + } + else + { + result += data.FallbackIrradiance * (1 - cascadeWeight); + } +#else + if (cascadeIndex == data.CascadesCount) + { + result += data.FallbackIrradiance * (1 - cascadeWeight); } #endif