From 60148ccc3975bf8bcd1f18fe3298d04a530ef135 Mon Sep 17 00:00:00 2001 From: antonmic <56370189+antonmic@users.noreply.github.com> Date: Thu, 21 Oct 2021 01:23:43 -0700 Subject: [PATCH] New Depth of Field - Minor improvements, optimizations, and now works with auto focus Signed-off-by: antonmic <56370189+antonmic@users.noreply.github.com> --- .../Common/Assets/Passes/NewDepthOfField.pass | 13 +++++++++ .../NewDepthOfFieldFilterLarge.azsl | 28 +++++++++++++++---- .../NewDepthOfFieldFilterSmall.azsl | 15 ++++++++-- .../PostProcessing/NewDepthOfFieldPasses.cpp | 8 ++++++ 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/Gems/Atom/Feature/Common/Assets/Passes/NewDepthOfField.pass b/Gems/Atom/Feature/Common/Assets/Passes/NewDepthOfField.pass index 483ce0e49a..70cebab5a1 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/NewDepthOfField.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/NewDepthOfField.pass @@ -18,6 +18,19 @@ } ], "PassRequests": [ + { + "Name": "AutoFocus", + "TemplateName": "DepthOfFieldReadBackFocusDepthTemplate", + "Connections": [ + { + "LocalSlot": "DepthInput", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "Depth" + } + } + ] + }, { "Name": "Downsample", "TemplateName": "NewDepthOfFieldDownsampleTemplate", diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterLarge.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterLarge.azsl index 497d73444b..6ab47b14ea 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterLarge.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterLarge.azsl @@ -85,6 +85,24 @@ PSOutput MainPS(VSOutput IN) float4 backgroundColor = float4(0, 0, 0, 0); + if(minCoc >= 0) + { + for(uint i = 0; i < SAMPLES_LOOP_TOTAL; ++i) + { + // Calculate sample offset + float3 offset = GetOffsetUV(i, offsetMultiplier); + + // Get sample + float4 sampleColorCoc = PassSrg::m_colorAndCoc.Sample(PassSrg::LinearSampler, pixelUV + offset.xy).rgba; + + // Calculate weight for sample + float weight = CaclulateWeight(offset.z, cocRadius, sampleColorCoc.a, centerCoc); + + // Accumulate + color += weight * sampleColorCoc; + } + } + else { float backgroundMin = min(0, centerCoc); color.rgb /= abs(color.a); @@ -112,17 +130,15 @@ PSOutput MainPS(VSOutput IN) backgroundColor += isBackground * sampleColorCoc; color += !isBackground * sampleColorCoc; } + + backgroundColor.rgb /= max(backgroundColor.a, COC_EPSILON); } - float backgroundRatio = backgroundColor.a / float(SAMPLES_LOOP_TOTAL); + float backgroundRatio = saturate( backgroundColor.a / float(SAMPLES_LOOP_TOTAL) ); float alpha = backgroundRatio > abs(centerCoc) ? -backgroundRatio : centerCoc; color.rgb /= max(color.a, COC_EPSILON); - backgroundColor.rgb /= max(backgroundColor.a, COC_EPSILON); - - color = color * saturate(1 - backgroundRatio) + backgroundColor * backgroundRatio; - //color.rgb += backgroundColor.rgb; - + color = lerp(color, backgroundColor, backgroundRatio); PSOutput OUT = (PSOutput)0; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterSmall.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterSmall.azsl index 440701ded9..05227cfee7 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterSmall.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/NewDepthOfFieldFilterSmall.azsl @@ -31,6 +31,16 @@ ShaderResourceGroup PassSrg : SRG_PerPass AddressV = Clamp; AddressW = Clamp; }; + + Sampler PointSampler + { + MinFilter = Point; + MagFilter = Point; + MipFilter = Point; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; + }; } float2 GetOffsetUV(uint index, float2 offsetMultiplier) @@ -44,7 +54,7 @@ PSOutput MainPS(VSOutput IN) float2 pixelUV = IN.m_texCoord.xy; // Sample pixel being shaded - float4 centerSample = PassSrg::m_colorAndCoc.Sample(PassSrg::LinearSampler, pixelUV).rgba; + float4 centerSample = PassSrg::m_colorAndCoc.Sample(PassSrg::PointSampler, pixelUV).rgba; float centerCoc = centerSample.a; // Aspect ratio = texture.x / texture.y = dimensions.x * dimensions.w @@ -65,7 +75,7 @@ PSOutput MainPS(VSOutput IN) float2 offsetUV = GetOffsetUV(i, offsetMultiplier); // Get sample - float4 sampleColorCoc = PassSrg::m_colorAndCoc.Sample(PassSrg::LinearSampler, pixelUV + offsetUV).rgba; + float4 sampleColorCoc = PassSrg::m_colorAndCoc.Sample(PassSrg::PointSampler, pixelUV + offsetUV).rgba; // Calculate weight float cocDiff = sampleColorCoc.a - centerCoc; @@ -85,4 +95,3 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.a = centerCoc; return OUT; } - diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/NewDepthOfFieldPasses.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/NewDepthOfFieldPasses.cpp index 7b9e46f6b1..b69484297a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/NewDepthOfFieldPasses.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/NewDepthOfFieldPasses.cpp @@ -149,6 +149,14 @@ namespace AZ float radius = (loop + 1.0f) / float(NewDepthOfFieldConstants::numberOfLoops); float loopCount = NewDepthOfFieldConstants::loopCounts[loop]; + float angleOffset = 0; + + // Every other loop slightly rotate sample ring so they don't line up + if (loop & 1) + { + angleOffset = Constants::TwoPi * 0.5f / loopCount; + } + for (float i = 0.0f; i < loopCount; ++i) { float angle = Constants::TwoPi * i / loopCount;