Skip to content

Commit 91b6557

Browse files
Fix a flickering issue related to moving shadow receivers (case 1302392) and a refactoring to avoid computing the same value for every effect. (#3039)
* Added a history rejection criterion based on if the pixel was moving in world space (case 1302392). * - Unifying the history validation pass so that it is only done once for the whole frame and not per effect. * missing line * Formatting * Fixing a render graph error Co-authored-by: Sebastien Lagarde <sebastien@unity3d.com>
1 parent 35b1f76 commit 91b6557

17 files changed

+261
-148
lines changed

com.unity.render-pipelines.high-definition/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1010
- Added pivot point manipulation for Decals (inspector and edit mode).
1111
- Added UV manipulation for Decals (edit mode).
1212
- Added color and intensity customization for Decals.
13+
- Added a history rejection criterion based on if the pixel was moving in world space (case 1302392).
1314

1415
### Fixed
1516

1617
### Changed
1718
- Removed the material pass probe volumes evaluation mode.
19+
- Unifying the history validation pass so that it is only done once for the whole frame and not per effect.
1820

1921
## [11.0.0] - 2020-10-21
2022

com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.RenderGraph.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ TextureHandle CreateAmbientOcclusionTexture(RenderGraph renderGraph)
1010
return renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { enableRandomWrite = true, colorFormat = GraphicsFormat.R8_UNorm, name = "Ambient Occlusion" });
1111
}
1212

13-
public TextureHandle Render(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthPyramid, TextureHandle normalBuffer, TextureHandle motionVectors, in HDUtils.PackedMipChainInfo depthMipInfo, ShaderVariablesRaytracing shaderVariablesRaytracing, TextureHandle rayCountTexture)
13+
public TextureHandle Render(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectors, TextureHandle historyValidityBuffer,
14+
in HDUtils.PackedMipChainInfo depthMipInfo, ShaderVariablesRaytracing shaderVariablesRaytracing, TextureHandle rayCountTexture)
1415
{
1516
var settings = hdCamera.volumeStack.GetComponent<AmbientOcclusion>();
1617

@@ -31,7 +32,8 @@ public TextureHandle Render(RenderGraph renderGraph, HDCamera hdCamera, TextureH
3132
hdCamera.AllocateAmbientOcclusionHistoryBuffer(scaleFactor);
3233

3334
if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.RayTracing) && settings.rayTracing.value)
34-
return m_RaytracingAmbientOcclusion.RenderRTAO(renderGraph, hdCamera, depthPyramid, normalBuffer, motionVectors, rayCountTexture, shaderVariablesRaytracing);
35+
return m_RaytracingAmbientOcclusion.RenderRTAO(renderGraph, hdCamera, depthBuffer, normalBuffer, motionVectors, historyValidityBuffer,
36+
rayCountTexture, shaderVariablesRaytracing);
3537
else
3638
{
3739
var historyRT = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.AmbientOcclusion);
@@ -44,8 +46,8 @@ public TextureHandle Render(RenderGraph renderGraph, HDCamera hdCamera, TextureH
4446

4547
var aoParameters = PrepareRenderAOParameters(hdCamera, historySize * rtScaleForHistory, depthMipInfo);
4648

47-
var packedData = RenderAO(renderGraph, aoParameters, depthPyramid, normalBuffer);
48-
result = DenoiseAO(renderGraph, aoParameters, depthPyramid, motionVectors, packedData, currentHistory, outputHistory);
49+
var packedData = RenderAO(renderGraph, aoParameters, depthBuffer, normalBuffer);
50+
result = DenoiseAO(renderGraph, aoParameters, depthBuffer, motionVectors, packedData, currentHistory, outputHistory);
4951
}
5052
}
5153
}

com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/ScreenSpaceShadowManager.RenderGraph.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ void WriteScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera, TextureH
8181
}
8282
}
8383

84-
bool RenderLightScreenSpaceShadows(RenderGraph renderGraph, HDCamera hdCamera, PrepassOutput prepassOutput, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
84+
bool RenderLightScreenSpaceShadows(RenderGraph renderGraph, HDCamera hdCamera,
85+
PrepassOutput prepassOutput, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle historyValidityBuffer,
86+
TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
8587
{
8688
// Loop through all the potential screen space light shadows
8789
for (int lightIdx = 0; lightIdx < m_ScreenSpaceShadowIndex; ++lightIdx)
@@ -106,7 +108,7 @@ bool RenderLightScreenSpaceShadows(RenderGraph renderGraph, HDCamera hdCamera, P
106108
case GPULightType.Spot:
107109
{
108110
RenderPunctualScreenSpaceShadow(renderGraph, hdCamera, currentLight, currentAdditionalLightData, m_CurrentScreenSpaceShadowData[lightIdx].lightDataIndex,
109-
prepassOutput, depthBuffer, normalBuffer, motionVectorsBuffer, rayCountTexture, screenSpaceShadowArray);
111+
prepassOutput, depthBuffer, normalBuffer, motionVectorsBuffer, historyValidityBuffer, rayCountTexture, screenSpaceShadowArray);
110112
}
111113
break;
112114
}
@@ -135,7 +137,8 @@ bool RequestedScreenSpaceShadows()
135137
return screenSpaceShadowDirectionalRequired || pointOrAreaLightShadowRequired;
136138
}
137139

138-
TextureHandle RenderScreenSpaceShadows(RenderGraph renderGraph, HDCamera hdCamera, PrepassOutput prepassOutput, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle rayCountTexture)
140+
TextureHandle RenderScreenSpaceShadows(RenderGraph renderGraph, HDCamera hdCamera,
141+
PrepassOutput prepassOutput, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle historyValidityBuffer, TextureHandle rayCountTexture)
139142
{
140143
// If screen space shadows are not supported for this camera, we are done
141144
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.ScreenSpaceShadows) || !RequestedScreenSpaceShadows())
@@ -147,12 +150,12 @@ TextureHandle RenderScreenSpaceShadows(RenderGraph renderGraph, HDCamera hdCamer
147150
TextureHandle screenSpaceShadowTexture = CreateScreenSpaceShadowTextureArray(renderGraph);
148151

149152
// First of all we handle the directional light
150-
RenderDirectionalLightScreenSpaceShadow(renderGraph, hdCamera, depthBuffer, normalBuffer, motionVectorsBuffer, rayCountTexture, screenSpaceShadowTexture);
153+
RenderDirectionalLightScreenSpaceShadow(renderGraph, hdCamera, depthBuffer, normalBuffer, motionVectorsBuffer, historyValidityBuffer, rayCountTexture, screenSpaceShadowTexture);
151154

152155
if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.RayTracing))
153156
{
154157
// We handle the other light sources
155-
RenderLightScreenSpaceShadows(renderGraph, hdCamera, prepassOutput, depthBuffer, normalBuffer, motionVectorsBuffer, rayCountTexture, screenSpaceShadowTexture);
158+
RenderLightScreenSpaceShadows(renderGraph, hdCamera, prepassOutput, depthBuffer, normalBuffer, motionVectorsBuffer, historyValidityBuffer, rayCountTexture, screenSpaceShadowTexture);
156159
}
157160

158161
// We render the debug view, if the texture is not used, it is not evaluated anyway

com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/ScreenSpaceShadowManagerDirectional.RenderGraph.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace UnityEngine.Rendering.HighDefinition
77
public partial class HDRenderPipeline
88
{
99
TextureHandle DenoiseDirectionalScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera,
10-
TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVetorsBuffer,
10+
TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVetorsBuffer, TextureHandle historyValidityBuffer,
1111
TextureHandle noisyBuffer, TextureHandle velocityBuffer, TextureHandle distanceBuffer)
1212
{
1313
// Is the history still valid?
@@ -26,7 +26,7 @@ TextureHandle DenoiseDirectionalScreenSpaceShadow(RenderGraph renderGraph, HDCam
2626
// Apply the temporal denoiser
2727
HDTemporalFilter temporalFilter = GetTemporalFilter();
2828
HDTemporalFilter.TemporalDenoiserArrayOutputData temporalFilterResult = temporalFilter.DenoiseBuffer(renderGraph, hdCamera,
29-
depthBuffer, normalBuffer, motionVetorsBuffer,
29+
depthBuffer, normalBuffer, motionVetorsBuffer, historyValidityBuffer,
3030
noisyBuffer, shadowHistoryArray,
3131
distanceBuffer, shadowHistoryDistanceArray,
3232
velocityBuffer,
@@ -59,7 +59,9 @@ class RTSDirectionalTracePassData
5959
public TextureHandle outputShadowBuffer;
6060
}
6161

62-
void RenderRayTracedDirectionalScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVetorsBuffer, TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
62+
void RenderRayTracedDirectionalScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera,
63+
TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVetorsBuffer, TextureHandle historyValidityBuffer,
64+
TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
6365
{
6466
TextureHandle directionalShadow;
6567
TextureHandle velocityBuffer;
@@ -107,7 +109,7 @@ void RenderRayTracedDirectionalScreenSpaceShadow(RenderGraph renderGraph, HDCame
107109
if (m_CurrentSunLightAdditionalLightData.filterTracedShadow && rtsdtParams.softShadow)
108110
{
109111
directionalShadow = DenoiseDirectionalScreenSpaceShadow(renderGraph, hdCamera,
110-
depthBuffer, normalBuffer, motionVetorsBuffer,
112+
depthBuffer, normalBuffer, motionVetorsBuffer, historyValidityBuffer,
111113
directionalShadow, velocityBuffer, distanceBuffer);
112114
}
113115

@@ -125,7 +127,9 @@ class SSSDirectionalTracePassData
125127
public TextureHandle screenSpaceShadowArray;
126128
}
127129

128-
void RenderDirectionalLightScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
130+
void RenderDirectionalLightScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera,
131+
TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle historyValidityBuffer,
132+
TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
129133
{
130134
// Should we be executing anything really?
131135
bool screenSpaceShadowRequired = m_CurrentSunLightAdditionalLightData != null && m_CurrentSunLightAdditionalLightData.WillRenderScreenSpaceShadow();
@@ -136,7 +140,7 @@ void RenderDirectionalLightScreenSpaceShadow(RenderGraph renderGraph, HDCamera h
136140
bool rayTracedDirectionalRequired = m_CurrentSunLightAdditionalLightData.WillRenderRayTracedShadow();
137141
// If the shadow is flagged as ray traced, we need to evaluate it completely
138142
if (rayTracedDirectionalRequired)
139-
RenderRayTracedDirectionalScreenSpaceShadow(renderGraph, hdCamera, depthBuffer, normalBuffer, motionVectorsBuffer, rayCountTexture, screenSpaceShadowArray);
143+
RenderRayTracedDirectionalScreenSpaceShadow(renderGraph, hdCamera, depthBuffer, normalBuffer, motionVectorsBuffer, historyValidityBuffer, rayCountTexture, screenSpaceShadowArray);
140144
else
141145
{
142146
using (var builder = renderGraph.AddRenderPass<SSSDirectionalTracePassData>("Directional RT Shadow", out var passData, ProfilingSampler.Get(HDProfileId.RaytracingDirectionalLightShadow)))

com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/ScreenSpaceShadowManagerPunctual.RenderGraph.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public partial class HDRenderPipeline
88
{
99
TextureHandle DenoisePunctualScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera,
1010
HDAdditionalLightData additionalLightData, in LightData lightData,
11-
TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVetorsBuffer,
11+
TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVetorsBuffer, TextureHandle historyValidityBuffer,
1212
TextureHandle noisyBuffer, TextureHandle velocityBuffer, TextureHandle distanceBufferI)
1313
{
1414
// Is the history still valid?
@@ -37,7 +37,7 @@ TextureHandle DenoisePunctualScreenSpaceShadow(RenderGraph renderGraph, HDCamera
3737
RTHandle shadowHistoryValidityArray = RequestShadowHistoryValidityBuffer(hdCamera);
3838

3939
temporalFilterResult = temporalFilter.DenoiseBuffer(renderGraph, hdCamera,
40-
depthBuffer, normalBuffer, motionVetorsBuffer,
40+
depthBuffer, normalBuffer, motionVetorsBuffer, historyValidityBuffer,
4141
noisyBuffer, shadowHistoryArray,
4242
distanceBuffer, shadowHistoryDistanceArray,
4343
velocityBuffer,
@@ -91,7 +91,7 @@ class RTSPunctualTracePassData
9191

9292
void RenderPunctualScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera
9393
, in LightData lightData, HDAdditionalLightData additionalLightData, int lightIndex,
94-
PrepassOutput prepassOutput, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
94+
PrepassOutput prepassOutput, TextureHandle depthBuffer, TextureHandle normalBuffer, TextureHandle motionVectorsBuffer, TextureHandle historyValidityBuffer, TextureHandle rayCountTexture, TextureHandle screenSpaceShadowArray)
9595
{
9696
TextureHandle pointShadowBuffer;
9797
TextureHandle velocityBuffer;
@@ -142,7 +142,7 @@ void RenderPunctualScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera
142142
{
143143
pointShadowBuffer = DenoisePunctualScreenSpaceShadow(renderGraph, hdCamera,
144144
additionalLightData, lightData,
145-
depthBuffer, normalBuffer, motionVectorsBuffer,
145+
depthBuffer, normalBuffer, motionVectorsBuffer, historyValidityBuffer,
146146
pointShadowBuffer, velocityBuffer, distanceBuffer);
147147
}
148148

com.unity.render-pipelines.high-definition/Runtime/Material/SubsurfaceScattering/SubsurfaceScatteringManagerRT.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ TextureHandle TraceRTSSS(RenderGraph renderGraph, HDCamera hdCamera, TextureHand
314314
}
315315
}
316316

317-
TextureHandle DenoiseRTSSS(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle rayTracedSSS, TextureHandle depthPyramid, TextureHandle normalBuffer, TextureHandle motionVectorBuffer)
317+
TextureHandle DenoiseRTSSS(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle rayTracedSSS, TextureHandle depthPyramid, TextureHandle normalBuffer, TextureHandle motionVectorBuffer, TextureHandle historyValidationTexture)
318318
{
319319
// Evaluate the history's validity
320320
float historyValidity = HDRenderPipeline.EvaluateHistoryValidity(hdCamera);
@@ -323,7 +323,7 @@ TextureHandle DenoiseRTSSS(RenderGraph renderGraph, HDCamera hdCamera, TextureHa
323323
HDTemporalFilter temporalFilter = GetTemporalFilter();
324324
TemporalFilterParameters tfParameters = temporalFilter.PrepareTemporalFilterParameters(hdCamera, false, historyValidity);
325325
TextureHandle historyBuffer = renderGraph.ImportTexture(RequestRayTracedSSSHistoryTexture(hdCamera));
326-
return temporalFilter.Denoise(renderGraph, hdCamera, tfParameters, rayTracedSSS, historyBuffer, depthPyramid, normalBuffer, motionVectorBuffer);
326+
return temporalFilter.Denoise(renderGraph, hdCamera, tfParameters, rayTracedSSS, historyBuffer, depthPyramid, normalBuffer, motionVectorBuffer, historyValidationTexture);
327327
}
328328

329329
class ComposeRTSSSPassData
@@ -371,15 +371,15 @@ TextureHandle CombineRTSSS(RenderGraph renderGraph, HDCamera hdCamera, TextureHa
371371

372372
TextureHandle RenderSubsurfaceScatteringRT(RenderGraph renderGraph, HDCamera hdCamera,
373373
TextureHandle depthStencilBuffer, TextureHandle normalBuffer, TextureHandle colorBuffer,
374-
TextureHandle sssColor, TextureHandle diffuseBuffer, TextureHandle motionVectorsBuffer, TextureHandle ssgiBuffer)
374+
TextureHandle sssColor, TextureHandle diffuseBuffer, TextureHandle motionVectorsBuffer, TextureHandle historyValidationTexture, TextureHandle ssgiBuffer)
375375
{
376376
using (new RenderGraphProfilingScope(renderGraph, ProfilingSampler.Get(HDProfileId.RaytracingSSS)))
377377
{
378378
// Trace the signal
379379
TextureHandle rtsssResult = TraceRTSSS(renderGraph, hdCamera, depthStencilBuffer, normalBuffer, sssColor, ssgiBuffer, diffuseBuffer, colorBuffer);
380380

381381
// Denoise the result
382-
rtsssResult = DenoiseRTSSS(renderGraph, hdCamera, rtsssResult, depthStencilBuffer, normalBuffer, motionVectorsBuffer);
382+
rtsssResult = DenoiseRTSSS(renderGraph, hdCamera, rtsssResult, depthStencilBuffer, normalBuffer, motionVectorsBuffer, historyValidationTexture);
383383

384384
// Compose it
385385
rtsssResult = CombineRTSSS(renderGraph, hdCamera, rtsssResult, depthStencilBuffer, sssColor, ssgiBuffer, diffuseBuffer, colorBuffer);

com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ internal enum HDProfileId
131131
// RT Deferred Lighting
132132
RaytracingDeferredLighting,
133133
// Denoisers
134+
HistoryValidity,
134135
TemporalFilter,
135136
DiffuseFilter,
136137

0 commit comments

Comments
 (0)