Skip to content

Commit 5a95c7a

Browse files
Hydrogent: enable OIT attenuation
1 parent 615fc17 commit 5a95c7a

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

Hydrogent/interface/Tasks/HnEndOITPassTask.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828

2929
#include "HnTask.hpp"
3030

31+
#include "../../../../DiligentCore/Graphics/GraphicsEngine/interface/PipelineState.h"
32+
#include "../../../../DiligentCore/Graphics/GraphicsEngine/interface/ShaderResourceBinding.h"
33+
#include "../../../../DiligentCore/Common/interface/RefCntAutoPtr.hpp"
34+
3135
namespace Diligent
3236
{
3337

@@ -64,6 +68,11 @@ class HnEndOITPassTask final : public HnTask
6468

6569
private:
6670
pxr::HdRenderIndex* m_RenderIndex = nullptr;
71+
72+
RefCntAutoPtr<IPipelineState> m_ApplyOITAttenuationPSO;
73+
RefCntAutoPtr<IShaderResourceBinding> m_ApplyOITAttenuationSRB;
74+
75+
Uint32 m_OITResourcesVersion = ~0u;
6776
};
6877

6978
} // namespace USD

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
773773
// OIT resources will be set in the SRB by HnBeginOITPassTask::Execute().
774774
if (m_OITResourcesVersion != m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::OITResources))
775775
{
776-
m_OITResourcesVersion = m_RenderParam->MakeAttribDirty(HnRenderParam::GlobalAttrib::OITResources);
776+
m_OITResourcesVersion = m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::OITResources);
777777
_GetFrameAttribsSRB(FrameAttribsSRBType::Transparent).Release();
778778
}
779779
}

Hydrogent/src/Tasks/HnEndOITPassTask.cpp

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "ScopedDebugGroup.hpp"
3030
#include "HnTokens.hpp"
3131
#include "HnFrameRenderTargets.hpp"
32+
#include "HnRenderParam.hpp"
3233

3334
namespace 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

6195
void 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

Comments
 (0)