@@ -44,34 +44,10 @@ namespace HLSL
4444#include " Shaders/PostProcess/ScreenSpaceReflection/public/ScreenSpaceReflectionStructures.fxh"
4545} // namespace HLSL
4646
47- static DILIGENT_CONSTEXPR DepthStencilStateDesc DSS_StencilWrite{
48- False, // DepthEnable
49- False, // DepthWriteEnable
50- COMPARISON_FUNC_ALWAYS, // DepthFunc
51- True, // StencilEnable
52- 0xFF , // StencilReadMask
53- 0xFF , // StencilWriteMask
54- {
55- STENCIL_OP_KEEP, // StencilFailOp
56- STENCIL_OP_KEEP, // StencilDepthFailOp
57- STENCIL_OP_REPLACE, // StencilPassOp
58- COMPARISON_FUNC_ALWAYS // StencilFunc
59- },
60- };
61-
62- static DILIGENT_CONSTEXPR DepthStencilStateDesc DSS_StencilReadComparisonEqual{
63- False, // DepthEnable
64- False, // DepthWriteEnable
65- COMPARISON_FUNC_ALWAYS, // DepthFunc
66- True, // StencilEnable
67- 0xFF , // StencilReadMask
68- 0xFF , // StencilWriteMask
69- {
70- STENCIL_OP_KEEP, // StencilFailOp
71- STENCIL_OP_KEEP, // StencilDepthFailOp
72- STENCIL_OP_KEEP, // StencilPassOp
73- COMPARISON_FUNC_EQUAL // StencilFunc
74- },
47+ static DILIGENT_CONSTEXPR DepthStencilStateDesc DSS_WriteAlways{
48+ True, // DepthEnable
49+ True, // DepthWriteEnable
50+ COMPARISON_FUNC_ALWAYS // DepthFunc
7551};
7652
7753ScreenSpaceReflection::ScreenSpaceReflection (IRenderDevice* pDevice, const CreateInfo& CI) :
@@ -181,11 +157,7 @@ void ScreenSpaceReflection::PrepareResources(IRenderDevice* pDevice, IDeviceCont
181157 m_Resources.Insert (RESOURCE_IDENTIFIER_ROUGHNESS, Device.CreateTexture (Desc));
182158 }
183159
184- TEXTURE_FORMAT DepthStencilFormat = TEX_FORMAT_D32_FLOAT_S8X24_UINT;
185-
186- TextureFormatInfoExt FormatInfo = Device.GetTextureFormatInfoExt (TEX_FORMAT_D24_UNORM_S8_UINT);
187- if (FormatInfo.Supported && FormatInfo.BindFlags & BIND_DEPTH_STENCIL)
188- DepthStencilFormat = TEX_FORMAT_D24_UNORM_S8_UINT;
160+ constexpr TEXTURE_FORMAT DepthStencilFormat = TEX_FORMAT_D16_UNORM;
189161
190162 {
191163 m_DepthStencilMaskDSVReadOnly.Release ();
@@ -502,6 +474,10 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
502474 Macros.Add (" SSR_OPTION_PREVIOUS_FRAME" , (m_FeatureFlags & FEATURE_FLAG_PREVIOUS_FRAME) != 0 );
503475 Macros.Add (" SSR_OPTION_HALF_RESOLUTION" , (m_FeatureFlags & FEATURE_FLAG_HALF_RESOLUTION) != 0 );
504476
477+ // We clear depth to 0.0 and then write 1.0 to mask pixels with reflection.
478+ const ShaderMacroHelper TriangleDepth05{{ShaderMacro{" TRIANGLE_DEPTH" , " 0.5" }}};
479+ const ShaderMacroHelper TriangleDepth10{{ShaderMacro{" TRIANGLE_DEPTH" , " 1.0" }}};
480+
505481 bool AllPSOsReady = true ;
506482
507483 {
@@ -547,7 +523,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
547523 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureDepth" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC, SHADER_VARIABLE_FLAG_UNFILTERABLE_FLOAT_TEXTURE_WEBGPU)
548524 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureMaterialParameters" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
549525
550- RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {} , ShaderFlags);
526+ RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, TriangleDepth10 , ShaderFlags);
551527 RefCntAutoPtr<IShader> PS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " SSR_ComputeStencilMaskAndExtractRoughness.fx" , " ComputeStencilMaskAndExtractRoughnessPS" , SHADER_TYPE_PIXEL, Macros, ShaderFlags);
552528
553529 RenderTech.InitializePSO (RenderAttribs.pDevice ,
@@ -557,7 +533,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
557533 m_Resources[RESOURCE_IDENTIFIER_ROUGHNESS].AsTexture ()->GetDesc ().Format ,
558534 },
559535 m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].AsTexture ()->GetDesc ().Format ,
560- DSS_StencilWrite , BS_Default, false , PSOFlags);
536+ DSS_WriteAlways , BS_Default, false , PSOFlags);
561537 }
562538 if (AllPSOsReady && !RenderTech.IsReady ())
563539 AllPSOsReady = false ;
@@ -573,15 +549,15 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
573549 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureDepth" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC, SHADER_VARIABLE_FLAG_UNFILTERABLE_FLOAT_TEXTURE_WEBGPU)
574550 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureRoughness" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
575551
576- RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {} , ShaderFlags);
552+ RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, TriangleDepth10 , ShaderFlags);
577553 RefCntAutoPtr<IShader> PS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " SSR_ComputeDownsampledStencilMask.fx" , " ComputeDownsampledStencilMaskPS" , SHADER_TYPE_PIXEL, Macros, ShaderFlags);
578554
579555 RenderTech.InitializePSO (RenderAttribs.pDevice ,
580556 RenderAttribs.pStateCache , " ScreenSpaceReflection::ComputeDownsampledStencilMask" ,
581557 VS, PS, ResourceLayout,
582558 {},
583559 m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].AsTexture ()->GetDesc ().Format ,
584- DSS_StencilWrite , BS_Default, false , PSOFlags);
560+ DSS_WriteAlways , BS_Default, false , PSOFlags);
585561 }
586562 if (AllPSOsReady && !RenderTech.IsReady ())
587563 AllPSOsReady = false ;
@@ -608,7 +584,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
608584 if (!SupportedFeatures.TextureSubresourceViews )
609585 ResourceLayout.AddImmutableSampler (SHADER_TYPE_PIXEL, " g_TextureDepthHierarchy" , Sam_PointClamp);
610586
611- RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {} , ShaderFlags);
587+ RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, TriangleDepth05 , ShaderFlags);
612588 RefCntAutoPtr<IShader> PS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " SSR_ComputeIntersection.fx" , " ComputeIntersectionPS" , SHADER_TYPE_PIXEL, Macros, ShaderFlags);
613589
614590 RenderTech.InitializePSO (RenderAttribs.pDevice ,
@@ -619,7 +595,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
619595 m_Resources[RESOURCE_IDENTIFIER_RAY_DIRECTION_PDF].AsTexture ()->GetDesc ().Format ,
620596 },
621597 m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].AsTexture ()->GetDesc ().Format ,
622- DSS_StencilReadComparisonEqual , BS_Default, true , PSOFlags);
598+ DSS_EnableDepthNoWrites , BS_Default, true , PSOFlags);
623599 }
624600 if (AllPSOsReady && !RenderTech.IsReady ())
625601 AllPSOsReady = false ;
@@ -640,7 +616,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
640616 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureIntersectSpecular" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
641617 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureRayLength" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
642618
643- RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {} , ShaderFlags);
619+ RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, TriangleDepth05 , ShaderFlags);
644620 RefCntAutoPtr<IShader> PS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " SSR_ComputeSpatialReconstruction.fx" , " ComputeSpatialReconstructionPS" , SHADER_TYPE_PIXEL, Macros, ShaderFlags);
645621
646622 RenderTech.InitializePSO (RenderAttribs.pDevice ,
@@ -652,7 +628,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
652628 m_Resources[RESOURCE_IDENTIFIER_RESOLVED_DEPTH].AsTexture ()->GetDesc ().Format ,
653629 },
654630 m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].AsTexture ()->GetDesc ().Format ,
655- DSS_StencilReadComparisonEqual , BS_Default, true , PSOFlags);
631+ DSS_EnableDepthNoWrites , BS_Default, true , PSOFlags);
656632 }
657633 if (AllPSOsReady && !RenderTech.IsReady ())
658634 AllPSOsReady = false ;
@@ -678,7 +654,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
678654 .AddImmutableSampler (SHADER_TYPE_PIXEL, " g_TexturePrevRadiance" , Sam_LinearClamp)
679655 .AddImmutableSampler (SHADER_TYPE_PIXEL, " g_TexturePrevVariance" , Sam_LinearClamp);
680656
681- RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {} , ShaderFlags);
657+ RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, TriangleDepth05 , ShaderFlags);
682658 RefCntAutoPtr<IShader> PS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " SSR_ComputeTemporalAccumulation.fx" , " ComputeTemporalAccumulationPS" , SHADER_TYPE_PIXEL, Macros, ShaderFlags);
683659
684660 RenderTech.InitializePSO (RenderAttribs.pDevice ,
@@ -689,7 +665,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
689665 m_Resources[RESOURCE_IDENTIFIER_VARIANCE_HISTORY0].AsTexture ()->GetDesc ().Format ,
690666 },
691667 m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].AsTexture ()->GetDesc ().Format ,
692- DSS_StencilReadComparisonEqual , BS_Default, true , PSOFlags);
668+ DSS_EnableDepthNoWrites , BS_Default, true , PSOFlags);
693669 }
694670 if (AllPSOsReady && !RenderTech.IsReady ())
695671 AllPSOsReady = false ;
@@ -710,7 +686,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
710686 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureRadiance" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
711687 .AddVariable (SHADER_TYPE_PIXEL, " g_TextureVariance" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
712688
713- RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {} , ShaderFlags);
689+ RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, TriangleDepth05 , ShaderFlags);
714690 RefCntAutoPtr<IShader> PS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " SSR_ComputeBilateralCleanup.fx" , " ComputeBilateralCleanupPS" , SHADER_TYPE_PIXEL, Macros, ShaderFlags);
715691
716692 RenderTech.InitializePSO (RenderAttribs.pDevice ,
@@ -720,7 +696,7 @@ bool ScreenSpaceReflection::PrepareShadersAndPSO(const RenderAttributes& RenderA
720696 m_Resources[RESOURCE_IDENTIFIER_OUTPUT].AsTexture ()->GetDesc ().Format ,
721697 },
722698 m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].AsTexture ()->GetDesc ().Format ,
723- DSS_StencilReadComparisonEqual , BS_Default, true , PSOFlags);
699+ DSS_EnableDepthNoWrites , BS_Default, true , PSOFlags);
724700 }
725701 if (AllPSOsReady && !RenderTech.IsReady ())
726702 AllPSOsReady = false ;
@@ -898,8 +874,8 @@ void ScreenSpaceReflection::ComputeStencilMaskAndExtractRoughness(const RenderAt
898874 ITextureView* pDSV = m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK].GetTextureDSV ();
899875
900876 RenderAttribs.pDeviceContext ->SetRenderTargets (_countof (pRTVs), pRTVs, pDSV, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
901- RenderAttribs. pDeviceContext -> ClearDepthStencil (pDSV, CLEAR_STENCIL_FLAG, 1.0 , 0x00 , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
902- RenderAttribs.pDeviceContext ->SetStencilRef ( 0xFF );
877+ // Clear depth to 0.0. Pixels that are not discarded write 1.0.
878+ RenderAttribs.pDeviceContext ->ClearDepthStencil (pDSV, CLEAR_DEPTH_FLAG_NONE, 0.0 , 0 , RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
903879 RenderAttribs.pDeviceContext ->SetPipelineState (RenderTech.PSO );
904880 RenderAttribs.pDeviceContext ->CommitShaderResources (RenderTech.SRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
905881 RenderAttribs.pDeviceContext ->Draw ({3 , DRAW_FLAG_VERIFY_ALL, 1 });
@@ -927,8 +903,8 @@ void ScreenSpaceReflection::ComputeDownsampledStencilMask(const RenderAttributes
927903 ITextureView* pDSV = m_Resources[RESOURCE_IDENTIFIER_DEPTH_STENCIL_MASK_HALF_RES].GetTextureDSV ();
928904
929905 RenderAttribs.pDeviceContext ->SetRenderTargets (0 , nullptr , pDSV, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
930- RenderAttribs. pDeviceContext -> ClearDepthStencil (pDSV, CLEAR_STENCIL_FLAG, 1.0 , 0x00 , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
931- RenderAttribs.pDeviceContext ->SetStencilRef ( 0xFF );
906+ // Clear depth to 0.0. Pixels that are not discarded write 1.0.
907+ RenderAttribs.pDeviceContext ->ClearDepthStencil (pDSV, CLEAR_DEPTH_FLAG, 0.0 , 0 , RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
932908 RenderAttribs.pDeviceContext ->SetPipelineState (RenderTech.PSO );
933909 RenderAttribs.pDeviceContext ->CommitShaderResources (RenderTech.SRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
934910 RenderAttribs.pDeviceContext ->Draw ({3 , DRAW_FLAG_VERIFY_ALL, 1 });
@@ -967,7 +943,6 @@ void ScreenSpaceReflection::ComputeIntersection(const RenderAttributes& RenderAt
967943 RenderAttribs.pDeviceContext ->SetRenderTargets (_countof (pRTVs), pRTVs, pDSV, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
968944 RenderAttribs.pDeviceContext ->ClearRenderTarget (pRTVs[0 ], RTVClearColor.Data (), RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
969945 RenderAttribs.pDeviceContext ->ClearRenderTarget (pRTVs[1 ], RTVClearColor.Data (), RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
970- RenderAttribs.pDeviceContext ->SetStencilRef (0xFF );
971946 RenderAttribs.pDeviceContext ->SetPipelineState (RenderTech.PSO );
972947 RenderAttribs.pDeviceContext ->CommitShaderResources (RenderTech.SRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
973948 RenderAttribs.pDeviceContext ->Draw ({3 , DRAW_FLAG_VERIFY_ALL, 1 });
@@ -1000,7 +975,6 @@ void ScreenSpaceReflection::ComputeSpatialReconstruction(const RenderAttributes&
1000975 };
1001976
1002977 RenderAttribs.pDeviceContext ->SetRenderTargets (_countof (pRTVs), pRTVs, m_DepthStencilMaskDSVReadOnly, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1003- RenderAttribs.pDeviceContext ->SetStencilRef (0xFF );
1004978 RenderAttribs.pDeviceContext ->SetPipelineState (RenderTech.PSO );
1005979 RenderAttribs.pDeviceContext ->CommitShaderResources (RenderTech.SRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1006980 RenderAttribs.pDeviceContext ->Draw ({3 , DRAW_FLAG_VERIFY_ALL, 1 });
@@ -1040,7 +1014,6 @@ void ScreenSpaceReflection::ComputeTemporalAccumulation(const RenderAttributes&
10401014
10411015 RenderAttribs.pDeviceContext ->CommitShaderResources (RenderTech.SRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
10421016 RenderAttribs.pDeviceContext ->SetRenderTargets (_countof (pRTVs), pRTVs, m_DepthStencilMaskDSVReadOnly, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1043- RenderAttribs.pDeviceContext ->SetStencilRef (0xFF );
10441017 RenderAttribs.pDeviceContext ->SetPipelineState (RenderTech.PSO );
10451018 RenderAttribs.pDeviceContext ->Draw ({3 , DRAW_FLAG_VERIFY_ALL, 1 });
10461019 RenderAttribs.pDeviceContext ->SetRenderTargets (0 , nullptr , nullptr , RESOURCE_STATE_TRANSITION_MODE_NONE);
@@ -1075,7 +1048,6 @@ void ScreenSpaceReflection::ComputeBilateralCleanup(const RenderAttributes& Rend
10751048
10761049 RenderAttribs.pDeviceContext ->SetRenderTargets (_countof (pRTVs), pRTVs, m_DepthStencilMaskDSVReadOnly, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
10771050 RenderAttribs.pDeviceContext ->ClearRenderTarget (pRTVs[0 ], RTVClearColor.Data (), RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1078- RenderAttribs.pDeviceContext ->SetStencilRef (0xFF );
10791051 RenderAttribs.pDeviceContext ->SetPipelineState (RenderTech.PSO );
10801052 RenderAttribs.pDeviceContext ->CommitShaderResources (RenderTech.SRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
10811053 RenderAttribs.pDeviceContext ->Draw ({3 , DRAW_FLAG_VERIFY_ALL, 1 });
0 commit comments