2929#include " ScopedDebugGroup.hpp"
3030#include " HnTokens.hpp"
3131#include " HnFrameRenderTargets.hpp"
32+ #include " HnRenderParam.hpp"
3233
3334namespace Diligent
3435{
@@ -56,6 +57,39 @@ void HnEndOITPassTask::Prepare(pxr::HdTaskContext* TaskCtx,
5657 pxr::HdRenderIndex* RenderIndex)
5758{
5859 m_RenderIndex = RenderIndex;
60+
61+ HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(RenderIndex->GetRenderDelegate ());
62+ const USD_Renderer& Renderer = *RenderDelegate->GetUSDRenderer ();
63+
64+ HnFrameRenderTargets* FrameTargets = GetFrameRenderTargets (TaskCtx);
65+ if (FrameTargets == nullptr )
66+ {
67+ UNEXPECTED (" Framebuffer targets are null" );
68+ return ;
69+ }
70+
71+ if (!m_ApplyOITAttenuationPSO)
72+ {
73+ ITextureView* pColorRTV = FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_SCENE_COLOR];
74+ if (pColorRTV == nullptr )
75+ {
76+ UNEXPECTED (" Scene color target is null" );
77+ return ;
78+ }
79+
80+ const TextureViewDesc& ColorDesc = pColorRTV->GetDesc ();
81+ Renderer.CreateApplyOITAttenuationPSO (ColorDesc.Format , TEX_FORMAT_UNKNOWN, &m_ApplyOITAttenuationPSO);
82+ VERIFY_EXPR (m_ApplyOITAttenuationPSO);
83+ }
84+
85+ HnRenderParam* RenderParam = static_cast <HnRenderParam*>(RenderDelegate->GetRenderParam ());
86+ if (m_OITResourcesVersion != RenderParam->GetAttribVersion (HnRenderParam::GlobalAttrib::OITResources))
87+ {
88+ m_ApplyOITAttenuationSRB.Release ();
89+ Renderer.CreateApplyOITAttenuationSRB (RenderDelegate->GetFrameAttribsCB (), FrameTargets->OIT .Layers , FrameTargets->OIT .Tail , &m_ApplyOITAttenuationSRB);
90+ VERIFY_EXPR (m_ApplyOITAttenuationSRB);
91+ m_OITResourcesVersion = RenderParam->GetAttribVersion (HnRenderParam::GlobalAttrib::OITResources);
92+ }
5993}
6094
6195void HnEndOITPassTask::Execute (pxr::HdTaskContext* TaskCtx)
@@ -66,8 +100,9 @@ void HnEndOITPassTask::Execute(pxr::HdTaskContext* TaskCtx)
66100 return ;
67101 }
68102
69- HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(m_RenderIndex->GetRenderDelegate ());
70- IDeviceContext* pCtx = RenderDelegate->GetDeviceContext ();
103+ HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(m_RenderIndex->GetRenderDelegate ());
104+ const USD_Renderer& Renderer = *RenderDelegate->GetUSDRenderer ();
105+ IDeviceContext* pCtx = RenderDelegate->GetDeviceContext ();
71106
72107 ScopedDebugGroup DebugGroup{pCtx, " End OIT pass" };
73108
@@ -78,12 +113,22 @@ void HnEndOITPassTask::Execute(pxr::HdTaskContext* TaskCtx)
78113 return ;
79114 }
80115
116+ ITextureView* pColorRTV = FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_SCENE_COLOR];
117+ if (pColorRTV == nullptr )
118+ {
119+ UNEXPECTED (" Scene color target is null" );
120+ return ;
121+ }
122+ pCtx->SetRenderTargets (1 , &pColorRTV, nullptr , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
123+
81124 const StateTransitionDesc Barriers[] =
82125 {
83126 {FrameTargets->OIT .Layers , RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
84127 {FrameTargets->OIT .Tail , RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
85128 };
86129 pCtx->TransitionResourceStates (_countof (Barriers), Barriers);
130+
131+ Renderer.ApplyOITAttenuation (pCtx, m_ApplyOITAttenuationPSO, m_ApplyOITAttenuationSRB);
87132}
88133
89134} // namespace USD
0 commit comments