@@ -62,6 +62,19 @@ bool HnEndOITPassTask::IsActive(pxr::HdRenderIndex& RenderIndex) const
6262 return RenderMode == HN_RENDER_MODE_SOLID;
6363}
6464
65+ static_assert (USD_Renderer::USD_PSO_FLAG_OIT_BLEND_OUTPUTS ==
66+ (USD_Renderer::USD_PSO_FLAG_ENABLE_COLOR_OUTPUT |
67+ USD_Renderer::USD_PSO_FLAG_ENABLE_BASE_COLOR_OUTPUT |
68+ USD_Renderer::USD_PSO_FLAG_ENABLE_MATERIAL_DATA_OUTPUT |
69+ USD_Renderer::USD_PSO_FLAG_ENABLE_IBL_OUTPUT),
70+ " Did you change OIT blend output targets? You may need to update this code." );
71+ static constexpr std::array<HnFrameRenderTargets::GBUFFER_TARGET, 4 > OITBlendTargetIds{
72+ HnFrameRenderTargets::GetGBufferTargetFromRendererOutputFlag (USD_Renderer::USD_PSO_FLAG_ENABLE_COLOR_OUTPUT),
73+ HnFrameRenderTargets::GetGBufferTargetFromRendererOutputFlag (USD_Renderer::USD_PSO_FLAG_ENABLE_BASE_COLOR_OUTPUT),
74+ HnFrameRenderTargets::GetGBufferTargetFromRendererOutputFlag (USD_Renderer::USD_PSO_FLAG_ENABLE_MATERIAL_DATA_OUTPUT),
75+ HnFrameRenderTargets::GetGBufferTargetFromRendererOutputFlag (USD_Renderer::USD_PSO_FLAG_ENABLE_IBL_OUTPUT),
76+ };
77+
6578void HnEndOITPassTask::Prepare (pxr::HdTaskContext* TaskCtx,
6679 pxr::HdRenderIndex* RenderIndex)
6780{
@@ -79,21 +92,18 @@ void HnEndOITPassTask::Prepare(pxr::HdTaskContext* TaskCtx,
7992
8093 if (!m_ApplyOITAttenuationPSO)
8194 {
82- ITextureView* pColorRTV = FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_SCENE_COLOR];
83- ITextureView* pBaseColorRTV = FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_BASE_COLOR];
84- ITextureView* pIblRTV = FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_IBL];
85- if (pColorRTV == nullptr || pBaseColorRTV == nullptr || pIblRTV == nullptr )
95+ std::array<TEXTURE_FORMAT, OITBlendTargetIds.size ()> RTVFormats;
96+ for (size_t i = 0 ; i < RTVFormats.size (); ++i)
8697 {
87- UNEXPECTED (" Scene color, base color or IBL target is null" );
88- return ;
98+ ITextureView* pRTV = FrameTargets->GBufferRTVs [OITBlendTargetIds[i]];
99+ if (pRTV == nullptr )
100+ {
101+ UNEXPECTED (" Frame render target " , HnFrameRenderTargets::GetGBufferTargetName (OITBlendTargetIds[i]), " is null" );
102+ return ;
103+ }
104+ RTVFormats[i] = pRTV->GetDesc ().Format ;
89105 }
90-
91- const TextureViewDesc& ColorDesc = pColorRTV->GetDesc ();
92- const TextureViewDesc& BaseColorDesc = pBaseColorRTV->GetDesc ();
93- const TextureViewDesc& IblDesc = pIblRTV->GetDesc ();
94- const TEXTURE_FORMAT RTVFormats[] = {ColorDesc.Format , BaseColorDesc.Format , IblDesc.Format };
95-
96- Renderer.CreateApplyOITAttenuationPSO (RTVFormats, _countof (RTVFormats), ~0u , TEX_FORMAT_UNKNOWN, &m_ApplyOITAttenuationPSO);
106+ Renderer.CreateApplyOITAttenuationPSO (RTVFormats.data (), static_cast <Uint32>(RTVFormats.size ()), ~0u , TEX_FORMAT_UNKNOWN, &m_ApplyOITAttenuationPSO);
97107 VERIFY_EXPR (m_ApplyOITAttenuationPSO);
98108 }
99109
@@ -116,6 +126,12 @@ void HnEndOITPassTask::Execute(pxr::HdTaskContext* TaskCtx)
116126 return ;
117127 }
118128
129+ if (!m_ApplyOITAttenuationPSO)
130+ {
131+ UNEXPECTED (" Apply OIT attenuation PSO is null." );
132+ return ;
133+ }
134+
119135 HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(m_RenderIndex->GetRenderDelegate ());
120136 const USD_Renderer& Renderer = *RenderDelegate->GetUSDRenderer ();
121137 IDeviceContext* pCtx = RenderDelegate->GetDeviceContext ();
@@ -129,18 +145,17 @@ void HnEndOITPassTask::Execute(pxr::HdTaskContext* TaskCtx)
129145 return ;
130146 }
131147
132- ITextureView* ppRTVs[] = {
133- FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_SCENE_COLOR],
134- FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_BASE_COLOR],
135- FrameTargets->GBufferRTVs [HnFrameRenderTargets::GBUFFER_TARGET_IBL],
136- };
137- if (ppRTVs[0 ] == nullptr || ppRTVs[1 ] == nullptr || ppRTVs[2 ] == nullptr )
148+ std::array<ITextureView*, OITBlendTargetIds.size ()> ppRTVs;
149+ for (size_t i = 0 ; i < ppRTVs.size (); ++i)
138150 {
139- UNEXPECTED (" Scene color, base color or IBL target is null" );
140- return ;
151+ ppRTVs[i] = FrameTargets->GBufferRTVs [OITBlendTargetIds[i]];
152+ if (ppRTVs[i] == nullptr )
153+ {
154+ UNEXPECTED (" Frame render target " , HnFrameRenderTargets::GetGBufferTargetName (OITBlendTargetIds[i]), " is null" );
155+ return ;
156+ }
141157 }
142-
143- pCtx->SetRenderTargets (_countof (ppRTVs), ppRTVs, nullptr , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
158+ pCtx->SetRenderTargets (static_cast <Uint32>(ppRTVs.size ()), ppRTVs.data (), nullptr , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
144159
145160 const StateTransitionDesc Barriers[] =
146161 {
0 commit comments