Skip to content

Commit d7cde5b

Browse files
eh-unityEvergreen
authored andcommitted
Move motion rendering order back to after opaques.
Fix Motion Vector render pass render order. Motion Vector pass depends on the Copy Depth pass. Copy Depth pass is moveable (from UniversalRenderer). Motion Vector pass order now correctly follows the Copy Depth pass. Motion Vectors can now be rendered after Opaques, instead of always rendering after Transparents.
1 parent c819ba2 commit d7cde5b

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ sealed class MotionVectorRenderPass : ScriptableRenderPass
2626
#endregion
2727

2828
#region Constructors
29-
internal MotionVectorRenderPass(Material cameraMaterial)
29+
internal MotionVectorRenderPass(RenderPassEvent evt, Material cameraMaterial)
3030
{
31-
renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;
31+
renderPassEvent = evt;
3232
m_CameraMaterial = cameraMaterial;
3333
m_PassData = new PassData();
3434
base.profilingSampler = ProfilingSampler.Get(URPProfileId.MotionVectors);

Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ public UniversalRenderer(UniversalRendererData data) : base(data)
270270
#endif
271271
m_DepthPrepass = new DepthOnlyPass(RenderPassEvent.BeforeRenderingPrePasses, RenderQueueRange.opaque, data.opaqueLayerMask);
272272
m_DepthNormalPrepass = new DepthNormalOnlyPass(RenderPassEvent.BeforeRenderingPrePasses, RenderQueueRange.opaque, data.opaqueLayerMask);
273-
m_MotionVectorPass = new MotionVectorRenderPass(m_CameraMotionVecMaterial);
274273

275274
if (renderingModeRequested == RenderingMode.Forward || renderingModeRequested == RenderingMode.ForwardPlus)
276275
{
@@ -312,13 +311,17 @@ public UniversalRenderer(UniversalRendererData data) : base(data)
312311
m_RenderOpaqueForwardWithRenderingLayersPass = new DrawObjectsWithRenderingLayersPass(URPProfileId.DrawOpaqueObjects, true, RenderPassEvent.BeforeRenderingOpaques, RenderQueueRange.opaque, data.opaqueLayerMask, m_DefaultStencilState, stencilData.stencilReference);
313312

314313
bool copyDepthAfterTransparents = m_CopyDepthMode == CopyDepthMode.AfterTransparents;
314+
RenderPassEvent copyDepthEvent = copyDepthAfterTransparents ? RenderPassEvent.AfterRenderingTransparents : RenderPassEvent.AfterRenderingSkybox;
315315

316316
m_CopyDepthPass = new CopyDepthPass(
317-
copyDepthAfterTransparents ? RenderPassEvent.AfterRenderingTransparents : RenderPassEvent.AfterRenderingSkybox,
317+
copyDepthEvent,
318318
copyDephPS,
319319
shouldClear: true,
320320
copyResolvedDepth: RenderingUtils.MultisampleDepthResolveSupported() && copyDepthAfterTransparents);
321321

322+
// Motion vectors depend on the (copy) depth texture. Depth is reprojected to calculate motion vectors.
323+
m_MotionVectorPass = new MotionVectorRenderPass(copyDepthEvent + 1, m_CameraMotionVecMaterial);
324+
322325
m_DrawSkyboxPass = new DrawSkyboxPass(RenderPassEvent.BeforeRenderingSkybox);
323326
m_CopyColorPass = new CopyColorPass(RenderPassEvent.AfterRenderingSkybox, m_SamplingMaterial, m_BlitMaterial);
324327
#if ADAPTIVE_PERFORMANCE_2_1_0_OR_NEWER
@@ -1700,7 +1703,11 @@ private RenderPassInputSummary GetRenderPassInputs(bool isTemporalAAEnabled, boo
17001703

17011704
// Motion vectors imply depth
17021705
if (inputSummary.requiresMotionVectors)
1706+
{
17031707
inputSummary.requiresDepthTexture = true;
1708+
inputSummary.requiresDepthTextureEarliestEvent = (RenderPassEvent)Mathf.Min((int)m_MotionVectorPass.renderPassEvent, (int)inputSummary.requiresDepthTextureEarliestEvent);
1709+
}
1710+
17041711

17051712
return inputSummary;
17061713
}

Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,10 @@ private void OnMainRendering(RenderGraph renderGraph, ScriptableRenderContext co
11481148
m_CopyDepthPass.Render(renderGraph, frameData, cameraDepthTexture, resourceData.activeDepthTexture, true);
11491149
}
11501150

1151+
// Depends on the camera (copy) depth texture. Depth is reprojected to calculate motion vectors.
1152+
if (renderPassInputs.requiresMotionVectors && m_CopyDepthMode != CopyDepthMode.AfterTransparents)
1153+
m_MotionVectorPass.Render(renderGraph, frameData, resourceData.cameraDepthTexture, resourceData.motionVectorColor, resourceData.motionVectorDepth);
1154+
11511155
RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.BeforeRenderingSkybox);
11521156

11531157
if (cameraData.camera.clearFlags == CameraClearFlags.Skybox && cameraData.renderType != CameraRenderType.Overlay)
@@ -1200,8 +1204,8 @@ private void OnMainRendering(RenderGraph renderGraph, ScriptableRenderContext co
12001204
// TODO: Postprocess pass should be able configure its render pass inputs per camera per frame (settings) BEFORE building any of the graph
12011205
// TODO: Alternatively we could always build the graph (a potential graph) and cull away unused passes if "record + cull" is fast enough.
12021206
// TODO: Currently we just override "requiresMotionVectors" for TAA in GetRenderPassInputs()
1203-
// Depends on camera depth
1204-
if (renderPassInputs.requiresMotionVectors)
1207+
// Depends on camera (copy) depth texture
1208+
if (renderPassInputs.requiresMotionVectors && m_CopyDepthMode == CopyDepthMode.AfterTransparents)
12051209
m_MotionVectorPass.Render(renderGraph, frameData, resourceData.cameraDepthTexture, resourceData.motionVectorColor, resourceData.motionVectorDepth);
12061210

12071211
if (context.HasInvokeOnRenderObjectCallbacks())

0 commit comments

Comments
 (0)