Skip to content

Commit 6de5e52

Browse files
Hydrogent: render MeshID of translucent materials in a separate pass
1 parent 0d5f855 commit 6de5e52

File tree

7 files changed

+53
-10
lines changed

7 files changed

+53
-10
lines changed

Hydrogent/interface/HnRenderPass.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ struct HnRenderPassParams
6565
USD_Renderer::RenderPassType Type = USD_Renderer::RenderPassType::Main;
6666
USD_Renderer::USD_PSO_FLAGS UsdPsoFlags = USD_Renderer::USD_PSO_FLAG_NONE;
6767

68+
// If not USD_Renderer::ALPHA_MODE_NUM_MODES, the alpha mode to use for the render pass.
69+
// Otherwise, the alpha mode is determined by the material tag.
70+
USD_Renderer::ALPHA_MODE AlphaMode = USD_Renderer::ALPHA_MODE_NUM_MODES;
71+
6872
constexpr bool operator==(const HnRenderPassParams& rhs) const
6973
{
7074
return (Selection == rhs.Selection &&

Hydrogent/interface/Tasks/HnTaskManager.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class HnTaskManager
6666
static constexpr TaskUID TaskUID_EndOITPass = 0xa4a829379e28420c;
6767
static constexpr TaskUID TaskUID_RenderRprimsAdditive = 0x37d45531106c4c52;
6868
static constexpr TaskUID TaskUID_RenderRprimsTranslucent = 0xa015c7e45941407e;
69+
static constexpr TaskUID TaskUID_RenderRprimsTranslucentMeshId = 0xb94c6316ea7f480c;
6970
static constexpr TaskUID TaskUID_RenderRprimsAdditiveSelected = 0x2cb8a35254ec46da;
7071
static constexpr TaskUID TaskUID_RenderRprimsTranslucentSelected = 0x50a786394d834b4f;
7172
static constexpr TaskUID TaskUID_RenderEnvMap = 0xf646122e1dc74bab;
@@ -113,6 +114,8 @@ class HnTaskManager
113114
/// * Renders all Rprims with additive material tag
114115
/// - RenderRprimsTranslucent
115116
/// * Renders all Rprims with translucent material tag
117+
/// - TaskUID_RenderRprimsTranslucentMeshId
118+
/// * Renders all Rprims with translucent material tag (Mesh ID, Motion Vectors, Depth)
116119
/// - RenderRprimsAdditiveSelected
117120
/// * Renders only selected Rprims with the additive material tag (depth only)
118121
/// - RenderRprimsTranslucentSelected
@@ -139,6 +142,7 @@ class HnTaskManager
139142
/// | RenderRprimsOITLayers | | | | | | | |
140143
/// | EndOITPass | | | | | | | |
141144
/// | RenderRprimsTranslucent | V | V | V | V | V | | V |
145+
/// | RenderRprimsTranslucentMeshId | V | V | | V | | | V |
142146
/// | RenderRprimsAdditiveSelected | V | | | | | V | |
143147
/// | RenderRprimsTranslucentSelected | V | | | | | V | |
144148
/// | ReadRprimId | | | | | | | |

Hydrogent/shaders/HnPostProcess.psh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ void main(in FullScreenTriangleVSOutput VSOut,
5353
float4 BaseColor = g_BaseColor.Load(int3(Pos.xy, 0));
5454
float4 Material = g_MaterialData.Load(int3(Pos.xy, 0));
5555

56-
float Roughness = Material.x;
57-
float Metallic = Material.y;
56+
float Roughness = saturate(Material.x);
57+
float Metallic = saturate(Material.y);
5858
SurfaceReflectanceInfo SrfInfo = GetSurfaceReflectanceMR(BaseColor.rgb, Metallic, Roughness);
5959

6060
float4 WorldPos = mul(float4(VSOut.f2NormalizedXY, DepthToNormalizedDeviceZ(0.5), 1.0), g_Frame.Camera.mViewProjInv);

Hydrogent/src/HnRenderPass.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ struct HnRenderPass::RenderState
131131
RendererSettings{USDRenderer.GetSettings()},
132132
pCtx{RenderDelegate.GetDeviceContext()},
133133
Type{RenderPass.m_Params.Type},
134-
AlphaMode{MaterialTagToPbrAlphaMode(RenderPass.m_MaterialTag)},
134+
AlphaMode{
135+
RenderPass.m_Params.AlphaMode != USD_Renderer::ALPHA_MODE_NUM_MODES ?
136+
RenderPass.m_Params.AlphaMode :
137+
MaterialTagToPbrAlphaMode(RenderPass.m_MaterialTag),
138+
},
135139
ConstantBufferOffsetAlignment{RenderDelegate.GetDevice()->GetAdapterInfo().Buffer.ConstantBufferOffsetAlignment},
136140
NativeMultiDrawSupported{RenderDelegate.GetDevice()->GetDeviceInfo().Features.NativeMultiDraw == DEVICE_FEATURE_STATE_ENABLED}
137141
{
@@ -391,10 +395,15 @@ HnRenderPass::EXECUTE_RESULT HnRenderPass::Execute(HnRenderPassState& RPState, c
391395

392396
RenderState State{*this, RPState};
393397

394-
const std::string DebugGroupName = std::string{"Render Pass - "} +
398+
std::string DebugGroupName = std::string{"Render Pass - "} +
395399
USD_Renderer::GetRenderPassTypeString(m_Params.Type) + " - " +
396400
m_MaterialTag.GetString() + " - " +
397401
HnRenderPassParams::GetSelectionTypeString(m_Params.Selection);
402+
if (m_Params.AlphaMode != USD_Renderer::ALPHA_MODE_NUM_MODES)
403+
{
404+
DebugGroupName += " - ";
405+
DebugGroupName += USD_Renderer::GetAlphaModeString(m_Params.AlphaMode);
406+
}
398407
ScopedDebugGroup DebugGroup{State.pCtx, DebugGroupName.c_str()};
399408

400409
RPState.Commit(State.pCtx);
@@ -1337,7 +1346,8 @@ void HnRenderPass::UpdateDrawListItemGPUResources(DrawListItem& ListItem, Render
13371346
PSOFlags |= (MaterialPSOFlags & (PBR_Renderer::PSO_FLAG_USE_COLOR_MAP & PBR_Renderer::PSO_FLAG_ENABLE_TEXCOORD_TRANSFORM));
13381347
}
13391348

1340-
VERIFY(pMaterial->GetMaterialData().Attribs.AlphaMode == State.AlphaMode || pMaterial->GetId().IsEmpty(),
1349+
VERIFY(((m_Params.AlphaMode != USD_Renderer::ALPHA_MODE_NUM_MODES ? m_Params.AlphaMode : pMaterial->GetMaterialData().Attribs.AlphaMode) == State.AlphaMode ||
1350+
pMaterial->GetId().IsEmpty()),
13411351
"Alpha mode derived from the material tag is not consistent with the alpha mode in the shader attributes. "
13421352
"This may indicate an issue in how alpha mode is determined in the material, or (less likely) an issue in Rprim sorting by Hydra.");
13431353
}

Hydrogent/src/Tasks/HnTaskManager.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,9 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
221221
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
222222
});
223223
CreateEndOITPassTask();
224-
// We will write mesh ID and depth in a separate pass
225-
TranslucentPassOutputs &= ~USD_Renderer::USD_PSO_FLAG_ENABLE_MESH_ID_OUTPUT;
224+
// We will write mesh ID, motion vectors and depth in a separate pass
225+
TranslucentPassOutputs &= ~(USD_Renderer::USD_PSO_FLAG_ENABLE_MESH_ID_OUTPUT |
226+
USD_Renderer::USD_PSO_FLAG_ENABLE_MOTION_VECTORS_OUTPUT);
226227
}
227228

228229
CreateRenderRprimsTask(HnMaterialTagTokens->translucent,
@@ -234,6 +235,20 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
234235
TranslucentPassOutputs,
235236
});
236237

238+
if (OITEnabled)
239+
{
240+
// When OIT is enabled, we do not render mesh ID, motion vectors and depth in translucent pass.
241+
CreateRenderRprimsTask(HnMaterialTagTokens->translucent,
242+
TaskUID_RenderRprimsTranslucentMeshId,
243+
{
244+
HnRenderResourceTokens->renderPass_TransparentAll,
245+
HnRenderPassParams::SelectionType::All,
246+
USD_Renderer::RenderPassType::Main,
247+
USD_Renderer::USD_PSO_FLAG_ENABLE_MESH_ID_OUTPUT | USD_Renderer::USD_PSO_FLAG_ENABLE_MOTION_VECTORS_OUTPUT,
248+
USD_Renderer::ALPHA_MODE_OPAQUE, // Override alpha mode
249+
});
250+
}
251+
237252
// Transparent selected RPrims -> {0 + SelectionDepth}
238253
CreateRenderRprimsTask(HnMaterialTagTokens->additive,
239254
TaskUID_RenderRprimsAdditiveSelected,
@@ -250,6 +265,7 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
250265
HnRenderPassParams::SelectionType::Selected,
251266
USD_Renderer::RenderPassType::Main,
252267
USD_Renderer::USD_PSO_FLAG_NONE,
268+
USD_Renderer::ALPHA_MODE_OPAQUE, // Override alpha mode
253269
});
254270

255271
CreateReadRprimIdTask();
@@ -357,6 +373,11 @@ pxr::SdfPath HnTaskManager::GetTaskId(const pxr::TfToken& TaskName) const
357373
pxr::SdfPath HnTaskManager::GetRenderRprimsTaskId(const pxr::TfToken& MaterialTag, const HnRenderPassParams& RenderPassParams) const
358374
{
359375
std::string Id = std::string{"RenderRprimsTask_"} + PBR_Renderer::GetRenderPassTypeString(RenderPassParams.Type) + "_" + MaterialTag.GetString();
376+
if (RenderPassParams.AlphaMode != USD_Renderer::ALPHA_MODE_NUM_MODES)
377+
{
378+
Id += "_";
379+
Id += USD_Renderer::GetAlphaModeString(RenderPassParams.AlphaMode);
380+
}
360381
for (char& c : Id)
361382
{
362383
if (c == ':' || c == ' ')

PBR/src/USD_Renderer.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,10 @@ USD_Renderer::CreateInfo::PSMainSourceInfo USD_Renderer::GetUsdPbrPSMainSource(U
119119
MaterialData = lerp(MaterialData, float2(1.0, 0.0), g_Frame.Renderer.LoadingAnimation.Factor);
120120
# endif
121121
#endif
122-
122+
123+
Normal *= Transmittance;
124+
MaterialData *= Transmittance;
125+
IBL *= Transmittance;
123126
)";
124127

125128
if (PSOFlags & USD_PSO_FLAG_ENABLE_ALL_OUTPUTS)

Shaders/PBR/private/RenderPBR.psh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,7 @@ PSOutput main(in VSOutput VSOut,
536536
}
537537
#endif
538538

539+
float Transmittance = 1.0;
539540
if (BasicAttribs.AlphaMode == PBR_ALPHA_MODE_BLEND)
540541
{
541542
OutColor.rgb *= BaseColor.a;
@@ -547,8 +548,8 @@ PSOutput main(in VSOutput VSOut,
547548
{
548549
D = 1.0 - D;
549550
}
550-
float T = GetOITTransmittance(D, uint2(VSOut.ClipPos.xy));
551-
OutColor.rgb *= T;
551+
Transmittance = GetOITTransmittance(D, uint2(VSOut.ClipPos.xy));
552+
OutColor.rgb *= Transmittance;
552553
}
553554
#endif
554555
}

0 commit comments

Comments
 (0)