From 648a7d85cc34fa88ebe8a9b7ce9d24353ee3f416 Mon Sep 17 00:00:00 2001 From: mriegger Date: Thu, 24 Jun 2021 10:26:45 -0700 Subject: [PATCH] Adjust Pdo shadow map bias --- .../Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl | 5 ++--- .../Assets/Materials/Types/StandardPBR_ForwardPass.azsl | 2 +- .../Materials/Types/StandardPBR_Shadowmap_WithPS.azsl | 7 +++---- .../Assets/ShaderLib/Atom/Features/Shadow/Shadow.azsli | 5 +++++ 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl index 6d3d4f2ea5..bea87ba336 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl @@ -15,6 +15,7 @@ #include #include #include +#include #include "MaterialInputs/AlphaInput.azsli" #include "MaterialInputs/ParallaxInput.azsli" @@ -78,8 +79,6 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) if(ShouldHandleParallaxInDepthShaders()) { - static const float ShadowMapDepthBias = 0.000001; - float3 tangents[UvSetCount] = { IN.m_tangent.xyz, IN.m_tangent.xyz }; float3 bitangents[UvSetCount] = { IN.m_bitangent.xyz, IN.m_bitangent.xyz }; @@ -92,7 +91,7 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) ObjectSrg::GetWorldMatrix(), uvMatrix, uvMatrixInverse, IN.m_uv[MaterialSrg::m_parallaxUvIndex], IN.m_worldPosition, OUT.m_depth); - OUT.m_depth += ShadowMapDepthBias; + OUT.m_depth += PdoShadowMapBias; } // Clip Alpha diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl index 23e4ef0c10..e370396b56 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl @@ -126,7 +126,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float ObjectSrg::GetWorldMatrix(), uvMatrix, uvMatrixInverse, IN.m_uv[MaterialSrg::m_parallaxUvIndex], IN.m_worldPosition, depthNDC, IN.m_position.w, displacementIsClipped); - // Adjust directional light shadow coorinates for parallax correction + // Adjust directional light shadow coordinates for parallax correction if(o_parallax_enablePixelDepthOffset) { const uint shadowIndex = ViewSrg::m_shadowIndexDirectionalLight; diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl index 8b6fee849e..8203c21243 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl @@ -15,6 +15,7 @@ #include #include #include +#include #include "MaterialInputs/AlphaInput.azsli" #include "MaterialInputs/ParallaxInput.azsli" @@ -78,9 +79,7 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) OUT.m_depth = IN.m_position.z; if(ShouldHandleParallaxInDepthShaders()) - { - static const float ShadowMapDepthBias = 0.000001; - + { float3 tangents[UvSetCount] = { IN.m_tangent.xyz, IN.m_tangent.xyz }; float3 bitangents[UvSetCount] = { IN.m_bitangent.xyz, IN.m_bitangent.xyz }; PrepareGeneratedTangent(IN.m_normal, IN.m_worldPosition, isFrontFace, IN.m_uv, UvSetCount, tangents, bitangents); @@ -92,7 +91,7 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) ObjectSrg::GetWorldMatrix(), uvMatrix, uvMatrixInverse, IN.m_uv[MaterialSrg::m_parallaxUvIndex], IN.m_worldPosition, OUT.m_depth); - OUT.m_depth += ShadowMapDepthBias; + OUT.m_depth += PdoShadowMapBias; } // Alpha diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/Shadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/Shadow.azsli index 138ea38562..091d886102 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/Shadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/Shadow.azsli @@ -14,6 +14,11 @@ static const float EsmExponentialShift = 87.; // slightly smaller value of log(FLT_MAX) +// Slope-scale depth bias doesn't work with depth writes. Apply a small bias with this value so that bicubic filtering +// won't have shadow acne +// Longer-term, we should probably try and implement Normal Offset biasing [GFX TODO][ATOM-15846] +static const float PdoShadowMapBias = 0.001; + // Must match the equivalent enumeration in ShadowConstants.h enum PcfFilterMethod { PcfFilterMethod_BoundarySearch = 0, PcfFilterMethod_Bicubic = 1 };