Skip to content

Commit b4e0a90

Browse files
Hydrogent: added mesh ID view mode
1 parent 26474a4 commit b4e0a90

File tree

5 files changed

+36
-8
lines changed

5 files changed

+36
-8
lines changed

Hydrogent/interface/HnTypes.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ enum HN_VIEW_MODE : Uint8
150150
/// Display edge map.
151151
HN_VIEW_MODE_EDGE_MAP,
152152

153+
/// Display mesh ID.
154+
HN_VIEW_MODE_MESH_ID,
155+
153156
/// The total number of view modes.
154157
HN_VIEW_MODE_COUNT
155158
};

Hydrogent/interface/Tasks/HnPostProcessTask.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ class HnPostProcessTask final : public HnTask
283283
ShaderResourceVariableX Normal;
284284
ShaderResourceVariableX BaseColor;
285285
ShaderResourceVariableX Material;
286+
ShaderResourceVariableX MeshID;
286287
};
287288
ShaderVariables Vars{};
288289
};

Hydrogent/shaders/HnPostProcess.psh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Texture2D g_Normal;
3333
Texture2D g_SpecularIBL;
3434
Texture2D g_MaterialData;
3535
Texture2D g_BaseColor;
36+
Texture2D g_MeshID;
3637

3738
Texture2D g_PreintegratedGGX;
3839
SamplerState g_PreintegratedGGX_sampler;
@@ -114,12 +115,18 @@ float ComputeDepthEdge(int2 Pos, float Depth)
114115
}
115116
#endif
116117

118+
float PseudoRandom(float n)
119+
{
120+
return frac(sin(n) * 43758.5453);
121+
}
122+
117123
void main(in FullScreenTriangleVSOutput VSOut,
118124
out float4 Color : SV_Target0)
119125
{
120126
float4 Pos = VSOut.f4PixelPos;
121127

122128
Color = g_ColorBuffer.Load(int3(Pos.xy, 0));
129+
123130
#if VIEW_MODE == VIEW_MODE_SCENE_DEPTH
124131
if (g_Frame.Renderer.LoadingAnimation.Factor == 0.0)
125132
{
@@ -194,6 +201,13 @@ void main(in FullScreenTriangleVSOutput VSOut,
194201
}
195202
#endif
196203

204+
#if VIEW_MODE == VIEW_MODE_MESH_ID
205+
float MeshID = g_MeshID.Load(int3(Pos.xy, 0)).r + 1.0;
206+
Color.rgb = (Depth != g_Frame.Camera.fFarPlaneDepth) ?
207+
float3(PseudoRandom(MeshID * 3.0 + 0.0), PseudoRandom(MeshID * 3.0 + 1.0), PseudoRandom(MeshID * 3.0 + 2.0)) :
208+
float3(0.0, 0.0, 0.0);
209+
#endif
210+
197211
float SelectionDepth = g_SelectionDepth.Load(int3(Pos.xy, 0)).r;
198212
bool IsSelected = Depth != g_Attribs.ClearDepth && SelectionDepth == Depth;
199213

Hydrogent/src/HnTypeConversions.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ const pxr::TfToken& PBRTextureAttribIdToPxrName(PBR_Renderer::TEXTURE_ATTRIB_ID
346346

347347
PBR_Renderer::DebugViewType HnViewModeToDebugViewType(HN_VIEW_MODE ViewMode)
348348
{
349-
static_assert(HN_VIEW_MODE_COUNT == 26, "Please handle the new view mode below");
349+
static_assert(HN_VIEW_MODE_COUNT == 27, "Please handle the new view mode below");
350350

351351
static const std::array<PBR_Renderer::DebugViewType, HN_VIEW_MODE_COUNT> ViewModeToDebugViewType = []() {
352352
std::array<PBR_Renderer::DebugViewType, HN_VIEW_MODE_COUNT> DebugViewTypes;
@@ -377,6 +377,7 @@ PBR_Renderer::DebugViewType HnViewModeToDebugViewType(HN_VIEW_MODE ViewMode)
377377
DebugViewTypes[HN_VIEW_MODE_CLEARCOAT_NORMAL] = PBR_Renderer::DebugViewType::ClearCoatNormal;
378378
DebugViewTypes[HN_VIEW_MODE_SCENE_DEPTH] = PBR_Renderer::DebugViewType::SceneDepth;
379379
DebugViewTypes[HN_VIEW_MODE_EDGE_MAP] = PBR_Renderer::DebugViewType::MeshNormal;
380+
DebugViewTypes[HN_VIEW_MODE_MESH_ID] = PBR_Renderer::DebugViewType::BaseColor;
380381
return DebugViewTypes;
381382
}();
382383
if (ViewMode < 0 || ViewMode >= HN_VIEW_MODE_COUNT)

Hydrogent/src/Tasks/HnPostProcessTask.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ HnPostProcessTask::~HnPostProcessTask()
7070
{
7171
}
7272

73-
static constexpr WebGPUResourceAttribs kWGPUDepthMapAttribs{WEB_GPU_BINDING_TYPE_UNFILTERABLE_FLOAT_TEXTURE, RESOURCE_DIM_TEX_2D};
73+
static constexpr WebGPUResourceAttribs kWGPUUnfilterableTex2D{WEB_GPU_BINDING_TYPE_UNFILTERABLE_FLOAT_TEXTURE, RESOURCE_DIM_TEX_2D};
7474

7575
void HnPostProcessTask::PostProcessingTechnique::PreparePRS()
7676
{
@@ -93,15 +93,16 @@ void HnPostProcessTask::PostProcessingTechnique::PreparePRS()
9393

9494
PRSDesc
9595
.AddResource(SHADER_TYPE_PIXEL, "g_ColorBuffer", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
96-
.AddResource(SHADER_TYPE_PIXEL, "g_Depth", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUDepthMapAttribs)
97-
.AddResource(SHADER_TYPE_PIXEL, "g_SelectionDepth", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUDepthMapAttribs)
96+
.AddResource(SHADER_TYPE_PIXEL, "g_Depth", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUUnfilterableTex2D)
97+
.AddResource(SHADER_TYPE_PIXEL, "g_SelectionDepth", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUUnfilterableTex2D)
9898
.AddResource(SHADER_TYPE_PIXEL, "g_ClosestSelectedLocation", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
9999
.AddResource(SHADER_TYPE_PIXEL, "g_SSR", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
100100
.AddResource(SHADER_TYPE_PIXEL, "g_SSAO", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
101101
.AddResource(SHADER_TYPE_PIXEL, "g_SpecularIBL", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
102102
.AddResource(SHADER_TYPE_PIXEL, "g_Normal", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
103103
.AddResource(SHADER_TYPE_PIXEL, "g_MaterialData", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
104-
.AddResource(SHADER_TYPE_PIXEL, "g_BaseColor", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
104+
.AddResource(SHADER_TYPE_PIXEL, "g_BaseColor", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
105+
.AddResource(SHADER_TYPE_PIXEL, "g_MeshID", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUUnfilterableTex2D);
105106

106107
PRS = RenderDeviceWithCache_N{pDevice, pStateCache}.CreatePipelineResourceSignature(PRSDesc);
107108
VERIFY_EXPR(PRS);
@@ -186,8 +187,12 @@ void HnPostProcessTask::PostProcessingTechnique::PreparePSO(TEXTURE_FORMAT RTVFo
186187
}
187188

188189
{
189-
if (_ViewMode != HN_VIEW_MODE_SCENE_DEPTH && _ViewMode != HN_VIEW_MODE_EDGE_MAP)
190+
if (_ViewMode != HN_VIEW_MODE_SCENE_DEPTH &&
191+
_ViewMode != HN_VIEW_MODE_EDGE_MAP &&
192+
_ViewMode != HN_VIEW_MODE_MESH_ID)
193+
{
190194
_ViewMode = HN_VIEW_MODE_SHADED;
195+
}
191196

192197
if (ViewMode != _ViewMode)
193198
{
@@ -216,6 +221,7 @@ void HnPostProcessTask::PostProcessingTechnique::PreparePSO(TEXTURE_FORMAT RTVFo
216221

217222
Macros.Add("VIEW_MODE_SCENE_DEPTH", static_cast<int>(HN_VIEW_MODE_SCENE_DEPTH));
218223
Macros.Add("VIEW_MODE_EDGE_MAP", static_cast<int>(HN_VIEW_MODE_EDGE_MAP));
224+
Macros.Add("VIEW_MODE_MESH_ID", static_cast<int>(HN_VIEW_MODE_MESH_ID));
219225
Macros.Add("VIEW_MODE", static_cast<int>(ViewMode));
220226

221227
if (GridFeatureFlags != CoordinateGridRenderer::FEATURE_FLAG_NONE)
@@ -288,6 +294,7 @@ void HnPostProcessTask::PostProcessingTechnique::PrepareSRB(ITextureView* pClose
288294
ITextureView* pNormalSRV = FrameTargets->GBufferSRVs[HnFrameRenderTargets::GBUFFER_TARGET_NORMAL];
289295
ITextureView* pMaterialSRV = FrameTargets->GBufferSRVs[HnFrameRenderTargets::GBUFFER_TARGET_MATERIAL];
290296
ITextureView* pBaseColorSRV = FrameTargets->GBufferSRVs[HnFrameRenderTargets::GBUFFER_TARGET_BASE_COLOR];
297+
ITextureView* pMeshID = FrameTargets->GBufferSRVs[HnFrameRenderTargets::GBUFFER_TARGET_MESH_ID];
291298
if (SRB)
292299
{
293300
auto VarValueChanged = [](const ShaderResourceVariableX& Var, IDeviceObject* pValue) {
@@ -303,7 +310,8 @@ void HnPostProcessTask::PostProcessingTechnique::PrepareSRB(ITextureView* pClose
303310
VarValueChanged(ShaderVars.SpecularIBL, pSpecularIblSRV) ||
304311
VarValueChanged(ShaderVars.Normal, pNormalSRV) ||
305312
VarValueChanged(ShaderVars.Material, pMaterialSRV) ||
306-
VarValueChanged(ShaderVars.BaseColor, pBaseColorSRV))
313+
VarValueChanged(ShaderVars.BaseColor, pBaseColorSRV) ||
314+
VarValueChanged(ShaderVars.MeshID, pMeshID))
307315
{
308316
Resources = {};
309317
CurrSRB = nullptr;
@@ -331,6 +339,7 @@ void HnPostProcessTask::PostProcessingTechnique::PrepareSRB(ITextureView* pClose
331339
SetVar(ShaderVars.Normal, "g_Normal", pNormalSRV);
332340
SetVar(ShaderVars.Material, "g_MaterialData", pMaterialSRV);
333341
SetVar(ShaderVars.BaseColor, "g_BaseColor", pBaseColorSRV);
342+
SetVar(ShaderVars.MeshID, "g_MeshID", pMeshID);
334343
// clang-format on
335344
}
336345

@@ -356,7 +365,7 @@ void HnPostProcessTask::CopyFrameTechnique::PreparePRS()
356365
.AddResource(SHADER_TYPE_PIXEL, "cbPostProcessAttribs", SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
357366
.AddResource(SHADER_TYPE_PIXEL, "cbFrameAttribs", SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
358367
.AddResource(SHADER_TYPE_PIXEL, "g_ColorBuffer", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
359-
.AddResource(SHADER_TYPE_PIXEL, "g_Depth", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUDepthMapAttribs);
368+
.AddResource(SHADER_TYPE_PIXEL, "g_Depth", SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE, kWGPUUnfilterableTex2D);
360369

361370
PRS = RenderDeviceWithCache_N{pDevice, pStateCache}.CreatePipelineResourceSignature(PRSDesc);
362371
VERIFY_EXPR(PRS);

0 commit comments

Comments
 (0)