Skip to content

Commit d9a75a7

Browse files
PBR Renderer and Hydrogent: added scene depth debug view mode
1 parent 085e570 commit d9a75a7

File tree

10 files changed

+76
-20
lines changed

10 files changed

+76
-20
lines changed

Hydrogent/interface/HnRenderPass.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ class HnRenderPass final : public pxr::HdRenderPass
9292

9393
void SetParams(const HnRenderPassParams& Params);
9494

95-
const pxr::TfToken& GetName() const
95+
const HnRenderPassParams& GetParams() const
9696
{
97-
return m_Params.Name;
97+
return m_Params;
9898
}
9999

100100
// A mapping from the primvar name to its role (e.g. "points" -> "point", "normals" -> "normal", "st0" -> "textureCoordinate", etc.)

Hydrogent/interface/Tasks/HnRenderEnvMapTask.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023 Diligent Graphics LLC
2+
* Copyright 2023-2025 Diligent Graphics LLC
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -67,6 +67,8 @@ class HnRenderEnvMapTask final : public HnTask
6767

6868
virtual void Execute(pxr::HdTaskContext* TaskCtx) override final;
6969

70+
virtual bool IsActive(pxr::HdRenderIndex& RenderIndex) const override final;
71+
7072
private:
7173
pxr::TfToken m_RenderPassName;
7274

Hydrogent/src/Tasks/HnBeginFrameTask.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
163163
}
164164
const TextureDesc& FinalTargetDesc = pFinalColorRTV->GetTexture()->GetDesc();
165165

166-
HnRenderDelegate* RenderDelegate = static_cast<HnRenderDelegate*>(RenderIndex->GetRenderDelegate());
166+
const HnRenderDelegate* RenderDelegate = static_cast<const HnRenderDelegate*>(RenderIndex->GetRenderDelegate());
167+
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
167168

168169
m_FrameBufferWidth = FinalTargetDesc.Width;
169170
m_FrameBufferHeight = FinalTargetDesc.Height;
@@ -252,10 +253,23 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
252253
std::array<float4, HnFrameRenderTargets::GBUFFER_TARGET_COUNT> ClearValues; // No need to zero-initialize
253254
for (Uint32 i = 0; i < HnFrameRenderTargets::GBUFFER_TARGET_COUNT; ++i)
254255
{
255-
// NB: we should clear alpha to one as it accumulates the total transmittance
256-
ClearValues[i] = (i == HnFrameRenderTargets::GBUFFER_TARGET_SCENE_COLOR) ?
257-
float4{m_Params.ClearColor.r, m_Params.ClearColor.g, m_Params.ClearColor.b, 1.0} :
258-
float4{0};
256+
if (i == HnFrameRenderTargets::GBUFFER_TARGET_SCENE_COLOR)
257+
{
258+
if (RenderParam->GetDebugView() != PBR_Renderer::DebugViewType::SceneDepth)
259+
{
260+
// NB: we should clear alpha to one as it accumulates the total transmittance
261+
ClearValues[i] = float4{m_Params.ClearColor.r, m_Params.ClearColor.g, m_Params.ClearColor.b, 1.0};
262+
}
263+
else
264+
{
265+
// Clear background to white in scene depth debug view mode
266+
ClearValues[i] = float4{1};
267+
}
268+
}
269+
else
270+
{
271+
ClearValues[i] = float4{0};
272+
}
259273
}
260274

261275
HnRenderPassState& RP_OpaqueSelected = m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueSelected];

Hydrogent/src/Tasks/HnBeginOITPassTask.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@ void HnBeginOITPassTask::Sync(pxr::HdSceneDelegate* Delegate,
5757

5858
bool HnBeginOITPassTask::IsActive(pxr::HdRenderIndex& RenderIndex) const
5959
{
60-
pxr::HdRenderDelegate* RenderDelegate = RenderIndex.GetRenderDelegate();
61-
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
62-
const HN_RENDER_MODE RenderMode = RenderParam->GetRenderMode();
60+
pxr::HdRenderDelegate* RenderDelegate = RenderIndex.GetRenderDelegate();
61+
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
62+
const HN_RENDER_MODE RenderMode = RenderParam->GetRenderMode();
63+
const PBR_Renderer::DebugViewType DebugView = RenderParam->GetDebugView();
6364

64-
return RenderMode == HN_RENDER_MODE_SOLID;
65+
// Scene depth debug view for transparent objects is rendered in opaque mode and does not need OIT layers.
66+
return RenderMode == HN_RENDER_MODE_SOLID && DebugView != PBR_Renderer::DebugViewType::SceneDepth;
6567
}
6668

6769
void HnBeginOITPassTask::Prepare(pxr::HdTaskContext* TaskCtx,

Hydrogent/src/Tasks/HnEndOITPassTask.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ void HnEndOITPassTask::Sync(pxr::HdSceneDelegate* Delegate,
5656

5757
bool HnEndOITPassTask::IsActive(pxr::HdRenderIndex& RenderIndex) const
5858
{
59-
pxr::HdRenderDelegate* RenderDelegate = RenderIndex.GetRenderDelegate();
60-
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
61-
const HN_RENDER_MODE RenderMode = RenderParam->GetRenderMode();
59+
pxr::HdRenderDelegate* RenderDelegate = RenderIndex.GetRenderDelegate();
60+
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
61+
const HN_RENDER_MODE RenderMode = RenderParam->GetRenderMode();
62+
const PBR_Renderer::DebugViewType DebugView = RenderParam->GetDebugView();
6263

63-
return RenderMode == HN_RENDER_MODE_SOLID;
64+
// Scene depth debug view for transparent objects is rendered in opaque mode and does not need OIT layers.
65+
return RenderMode == HN_RENDER_MODE_SOLID && DebugView != PBR_Renderer::DebugViewType::SceneDepth;
6466
}
6567

6668
static_assert(USD_Renderer::USD_PSO_FLAG_OIT_BLEND_OUTPUTS ==

Hydrogent/src/Tasks/HnRenderEnvMapTask.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,17 @@ void HnRenderEnvMapTask::Sync(pxr::HdSceneDelegate* Delegate,
8181
*DirtyBits = pxr::HdChangeTracker::Clean;
8282
}
8383

84+
bool HnRenderEnvMapTask::IsActive(pxr::HdRenderIndex& RenderIndex) const
85+
{
86+
pxr::HdRenderDelegate* RenderDelegate = RenderIndex.GetRenderDelegate();
87+
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
88+
const HN_RENDER_MODE RenderMode = RenderParam->GetRenderMode();
89+
const PBR_Renderer::DebugViewType DebugView = RenderParam->GetDebugView();
90+
91+
// Background is cleared to white in scene depth debug view mode
92+
return !(RenderMode == HN_RENDER_MODE_SOLID && DebugView == PBR_Renderer::DebugViewType::SceneDepth);
93+
}
94+
8495
static std::string GetEnvMapPSMain()
8596
{
8697
static_assert(HnFrameRenderTargets::GBUFFER_TARGET_COUNT == 7, "Did you change the number of G-buffer targets? You may need to update the code below.");

Hydrogent/src/Tasks/HnRenderRprimsTask.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,23 @@ bool HnRenderRprimsTask::IsActive(pxr::HdRenderIndex& RenderIndex) const
129129
const HnRenderParam* RenderParam = static_cast<const HnRenderParam*>(RenderDelegate->GetRenderParam());
130130
const HN_RENDER_MODE RenderMode = RenderParam->GetRenderMode();
131131

132-
return (m_Params.RenderModes & (1u << RenderMode)) != 0;
132+
if ((m_Params.RenderModes & (1u << RenderMode)) == 0)
133+
return false;
134+
135+
if (m_RenderPass && m_RenderPass->GetParams().Type == USD_Renderer::RenderPassType::OITLayers)
136+
{
137+
// Scene depth debug view for transparent objects is rendered in opaque mode and does not need OIT layers.
138+
return RenderParam->GetDebugView() != PBR_Renderer::DebugViewType::SceneDepth;
139+
}
140+
141+
return true;
133142
}
134143

135144
void HnRenderRprimsTask::Execute(pxr::HdTaskContext* TaskCtx)
136145
{
137146
if (m_RenderPass)
138147
{
139-
const pxr::TfToken& RenderPassName = m_RenderPass->GetName();
148+
const pxr::TfToken& RenderPassName = m_RenderPass->GetParams().Name;
140149

141150
// Render pass state is initialized by HnBeginFrameTask.
142151
if (HnRenderPassState* RenderPassState = GetRenderPassState(TaskCtx, RenderPassName))

PBR/interface/PBR_Renderer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ class PBR_Renderer
444444
IridescenceThickness,
445445
Transmission,
446446
Thickness,
447+
SceneDepth,
447448
NumDebugViews
448449
};
449450

PBR/src/PBR_Renderer.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ PBR_Renderer::PSOKey::PSOKey(RenderPassType _Type,
112112
DebugView = DebugViewType::None;
113113
}
114114

115+
if (DebugView == DebugViewType::SceneDepth)
116+
{
117+
// Rendering scene depth with blending does not make sense,
118+
// so force alpha mode to opaque.
119+
AlphaMode = ALPHA_MODE_OPAQUE;
120+
}
121+
115122
if (Flags & PSO_FLAG_UNSHADED)
116123
{
117124
AlphaMode = ALPHA_MODE_OPAQUE;
@@ -1382,7 +1389,7 @@ ShaderMacroHelper PBR_Renderer::DefineMacros(const PSOKey& Key) const
13821389
Macros.Add("PCF_FILTER_SIZE", KernelSize);
13831390
}
13841391

1385-
static_assert(static_cast<int>(DebugViewType::NumDebugViews) == 34, "Did you add debug view? You may need to handle it here.");
1392+
static_assert(static_cast<int>(DebugViewType::NumDebugViews) == 35, "Did you add debug view? You may need to handle it here.");
13861393
// clang-format off
13871394
Macros.Add("DEBUG_VIEW", static_cast<int>(Key.GetDebugView()));
13881395
Macros.Add("DEBUG_VIEW_NONE", static_cast<int>(DebugViewType::None));
@@ -1419,6 +1426,7 @@ ShaderMacroHelper PBR_Renderer::DefineMacros(const PSOKey& Key) const
14191426
Macros.Add("DEBUG_VIEW_IRIDESCENCE_THICKNESS", static_cast<int>(DebugViewType::IridescenceThickness));
14201427
Macros.Add("DEBUG_VIEW_TRANSMISSION", static_cast<int>(DebugViewType::Transmission));
14211428
Macros.Add("DEBUG_VIEW_THICKNESS", static_cast<int>(DebugViewType::Thickness));
1429+
Macros.Add("DEBUG_VIEW_SCENE_DEPTH", static_cast<int>(DebugViewType::SceneDepth));
14221430
// clang-format on
14231431

14241432
static_assert(static_cast<int>(LoadingAnimationMode::Count) == 3, "Did you add new loading animation mode? You may need to handle it here.");
@@ -2596,7 +2604,7 @@ void* PBR_Renderer::WriteSkinningData(void* pDst, const WriteSkinningDataAttribs
25962604

25972605
const char* PBR_Renderer::GetDebugViewTypeString(DebugViewType DebugView)
25982606
{
2599-
static_assert(static_cast<int>(DebugViewType::NumDebugViews) == 34, "Please update the switch below to handle the new debug view type");
2607+
static_assert(static_cast<int>(DebugViewType::NumDebugViews) == 35, "Please update the switch below to handle the new debug view type");
26002608
switch (DebugView)
26012609
{
26022610
#define DEBUG_VIEW_TYPE_CASE(Type) \
@@ -2636,6 +2644,7 @@ const char* PBR_Renderer::GetDebugViewTypeString(DebugViewType DebugView)
26362644
DEBUG_VIEW_TYPE_CASE(IridescenceThickness);
26372645
DEBUG_VIEW_TYPE_CASE(Transmission);
26382646
DEBUG_VIEW_TYPE_CASE(Thickness);
2647+
DEBUG_VIEW_TYPE_CASE(SceneDepth);
26392648
#undef DEBUG_VIEW_TYPE_CASE
26402649

26412650
default:

Shaders/PBR/private/RenderPBR.psh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,12 @@ PSOutput main(in VSOutput VSOut,
594594
{
595595
// Already handled
596596
}
597+
# elif (DEBUG_VIEW == DEBUG_VIEW_SCENE_DEPTH)
598+
{
599+
float CameraZ = DepthToCameraZ(VSOut.ClipPos.z, g_Frame.Camera.mProj);
600+
CameraZ = (CameraZ - g_Frame.Camera.fNearPlaneZ) / (g_Frame.Camera.fFarPlaneZ - g_Frame.Camera.fNearPlaneZ);
601+
OutColor.rgb = float3(CameraZ, CameraZ, CameraZ);
602+
}
597603
# elif (DEBUG_VIEW != DEBUG_VIEW_NONE)
598604
{
599605
OutColor.rgb = GetDebugColor(Shading, SrfLighting);

0 commit comments

Comments
 (0)