From 346e294f600c972954e2f56d03113081178ffeac Mon Sep 17 00:00:00 2001 From: mriegger Date: Thu, 1 Jul 2021 09:02:02 -0700 Subject: [PATCH] Switch directional light to use the same reformulation as projected shadow and reduce to 16 bit float RT for perf --- .../Common/Assets/Passes/DepthExponentiation.pass | 2 +- .../Common/Assets/Passes/FilterDepthVertical.pass | 2 +- .../Atom/Features/Shadow/DirectionalLightShadow.azsli | 10 ++++++---- .../Assets/Shaders/Shadow/DepthExponentiation.azsl | 7 +------ 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass index c08f5c9e4a..82dd13935a 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass @@ -54,7 +54,7 @@ "Attachment": "Depth" }, "ImageDescriptor": { - "Format": "R32_FLOAT" + "Format": "R16_FLOAT" } } ], diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass index 321d0abf4a..5d8a4de21b 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass @@ -54,7 +54,7 @@ "Attachment": "Input" }, "ImageDescriptor": { - "Format": "R32_FLOAT" + "Format": "R16_FLOAT" } } ], diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli index 7b592d6458..30fab2d2a6 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli @@ -356,8 +356,9 @@ float DirectionalLightShadow::GetVisibilityFromLightEsm() { const float distanceWithinCameraView = depthDiff / (1. - distanceMin); const float3 coord = float3(shadowCoord.xy, indexOfCascade); - const float expDepthInShadowmap = expShadowmap.Sample(PassSrg::LinearSampler, coord).r; - const float ratio = exp(-EsmExponentialShift * distanceWithinCameraView) * expDepthInShadowmap; + const float occluder = expShadowmap.Sample(PassSrg::LinearSampler, coord).r; + const float exponent = -EsmExponentialShift * (distanceWithinCameraView - occluder); + const float ratio = exp(exponent); m_debugInfo.m_cascadeIndex = indexOfCascade; return saturate(ratio); @@ -385,8 +386,9 @@ float DirectionalLightShadow::GetVisibilityFromLightEsmPcf() { const float distanceWithinCameraView = depthDiff / (1. - distanceMin); const float3 coord = float3(shadowCoord.xy, indexOfCascade); - const float expDepthInShadowmap = expShadowmap.Sample(PassSrg::LinearSampler, coord).r; - float ratio = exp(-EsmExponentialShift * distanceWithinCameraView) * expDepthInShadowmap; + const float occluder = expShadowmap.Sample(PassSrg::LinearSampler, coord).r; + const float exponent = -EsmExponentialShift * (distanceWithinCameraView - occluder); + float ratio = exp(exponent); static const float pcfFallbackThreshold = 1.04; if (ratio > pcfFallbackThreshold) diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/DepthExponentiation.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/DepthExponentiation.azsl index ba2a4aaf92..c620047d52 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/DepthExponentiation.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/DepthExponentiation.azsl @@ -63,12 +63,7 @@ void MainCS(uint3 dispatchId: SV_DispatchThreadID) // So this converts it to "depth" to emphasize the difference // within the frustum. const float depth = (depthInClip - distanceMin) / (1. - distanceMin); - - // Todo: Expose Esm exponent slider for directional lights - // This would remove the exp calculation below, collapsing it into a subtraction in DirectionalLightShadow.azsli - // ATOM-15775 - const float outValue = exp(EsmExponentialShift * depth); - PassSrg::m_outputShadowmap[dispatchId].r = outValue; + PassSrg::m_outputShadowmap[dispatchId].r = depth; break; } case ShadowmapLightType::Spot: