Skip to content

Commit 54042c8

Browse files
pema99Evergreen
authored andcommitted
Disable receiving SSR on transparent objects when transparency support is disabled, and fix some bugs
1 parent c29a434 commit 54042c8

6 files changed

Lines changed: 101 additions & 29 deletions

File tree

Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalResourceData.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,18 @@ internal TextureHandle irradianceTexture
327327
}
328328
private TextureHandle _irradianceTexture;
329329

330+
#if URP_SCREEN_SPACE_REFLECTION
331+
/// <summary>
332+
/// Screen Space reflection texture.
333+
/// </summary>
334+
internal TextureHandle ssrTexture
335+
{
336+
get => CheckAndGetTextureHandle(ref _ssrTexture);
337+
set => CheckAndSetTextureHandle(ref _ssrTexture, value);
338+
}
339+
private TextureHandle _ssrTexture;
340+
#endif
341+
330342
/// <summary>
331343
/// STP debug visualization written to by the STP upscaler.
332344
/// </summary>
@@ -370,6 +382,9 @@ public override void Reset()
370382
_dBufferDepth = TextureHandle.nullHandle;
371383
_ssaoTexture = TextureHandle.nullHandle;
372384
_irradianceTexture = TextureHandle.nullHandle;
385+
#if URP_SCREEN_SPACE_REFLECTION
386+
_ssrTexture = TextureHandle.nullHandle;
387+
#endif
373388
_stpDebugView = TextureHandle.nullHandle;
374389
_destinationCameraColor = TextureHandle.nullHandle;
375390

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

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ public partial class DrawObjectsPass : ScriptableRenderPass
2323
/// </summary>
2424
public bool m_ShouldTransparentsReceiveShadows;
2525

26+
#if URP_SCREEN_SPACE_REFLECTION
27+
/// <summary>
28+
/// Used to indicate whether transparent objects should receive screen space reflections or not.
29+
/// </summary>
30+
public bool shouldTransparentsReceiveSSR { get; set; }
31+
#endif
32+
2633
static readonly int s_DrawObjectPassDataPropID = Shader.PropertyToID("_DrawObjectPassData");
2734

2835
/// <summary>
@@ -86,6 +93,9 @@ internal void Init(bool opaque, RenderPassEvent evt, RenderQueueRange renderQueu
8693
m_RenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
8794
m_IsOpaque = opaque;
8895
m_ShouldTransparentsReceiveShadows = false;
96+
#if URP_SCREEN_SPACE_REFLECTION
97+
shouldTransparentsReceiveSSR = false;
98+
#endif
8999

90100
if (stencilState.enabled)
91101
{
@@ -151,10 +161,16 @@ internal class PassData
151161
internal TextureHandle albedoHdl;
152162
internal TextureHandle depthHdl;
153163
internal TextureHandle screenSpaceIrradianceHdl;
164+
#if URP_SCREEN_SPACE_REFLECTION
165+
internal TextureHandle screenSpaceReflectionHdl;
166+
#endif
154167

155168
internal UniversalCameraData cameraData;
156169
internal bool isOpaque;
157170
internal bool shouldTransparentsReceiveShadows;
171+
#if URP_SCREEN_SPACE_REFLECTION
172+
internal bool shouldTransparentsReceiveSSR;
173+
#endif
158174
internal uint batchLayerMask;
159175
internal bool isActiveTargetBackBuffer;
160176
internal RendererListHandle rendererListHdl;
@@ -175,6 +191,9 @@ internal void InitPassData(UniversalCameraData cameraData, ref PassData passData
175191
passData.cameraData = cameraData;
176192
passData.isOpaque = m_IsOpaque;
177193
passData.shouldTransparentsReceiveShadows = m_ShouldTransparentsReceiveShadows;
194+
#if URP_SCREEN_SPACE_REFLECTION
195+
passData.shouldTransparentsReceiveSSR = shouldTransparentsReceiveSSR;
196+
#endif
178197
passData.batchLayerMask = batchLayerMask;
179198
passData.isActiveTargetBackBuffer = isActiveTargetBackBuffer;
180199
}
@@ -202,7 +221,7 @@ internal void InitRendererLists(UniversalRenderingData renderingData, UniversalC
202221
m_RenderStateBlock.depthState = new DepthState(false, CompareFunction.Equal);
203222
m_RenderStateBlock.mask |= RenderStateMask.Depth;
204223
}
205-
else
224+
else
206225
{
207226
m_RenderStateBlock.depthState = DepthState.defaultValue;
208227
m_RenderStateBlock.mask &= ~RenderStateMask.Depth;
@@ -269,6 +288,19 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex
269288
builder.UseTexture(irradianceTexture, AccessFlags.Read);
270289
}
271290

291+
#if URP_SCREEN_SPACE_REFLECTION
292+
TextureHandle ssrTexture = resourceData.ssrTexture;
293+
if (ssrTexture.IsValid())
294+
{
295+
passData.screenSpaceReflectionHdl = ssrTexture;
296+
builder.UseTexture(ssrTexture, AccessFlags.Read);
297+
}
298+
else
299+
{
300+
passData.screenSpaceReflectionHdl = TextureHandle.nullHandle;
301+
}
302+
#endif
303+
272304
RenderGraphUtils.UseDBufferIfValid(builder, resourceData);
273305

274306
InitRendererLists(renderingData, cameraData, lightData, ref passData, renderGraph, disableZWrite);
@@ -318,6 +350,15 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex
318350
context.cmd.SetGlobalTexture(ShaderPropertyId.screenSpaceIrradiance, data.screenSpaceIrradianceHdl);
319351
}
320352

353+
#if URP_SCREEN_SPACE_REFLECTION
354+
bool useSSR = data.screenSpaceReflectionHdl.IsValid() && (data.isOpaque || data.shouldTransparentsReceiveSSR);
355+
context.cmd.SetKeyword(ShaderGlobalKeywords.ScreenSpaceReflection, useSSR);
356+
if (useSSR)
357+
{
358+
context.cmd.SetGlobalTexture(ShaderPropertyId.screenSpaceReflection, data.screenSpaceReflectionHdl);
359+
}
360+
#endif
361+
321362
ExecutePass(context.cmd, data, data.rendererListHdl, data.objectsWithErrorRendererListHdl, yFlip);
322363
});
323364
}
@@ -364,7 +405,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex
364405
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
365406
UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
366407
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
367-
UniversalLightData lightData = frameData.Get<UniversalLightData>();
408+
UniversalLightData lightData = frameData.Get<UniversalLightData>();
368409

369410
InitPassData(cameraData, ref passData.basePassData, batchLayerMask);
370411

@@ -444,4 +485,4 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex
444485
}
445486
}
446487
}
447-
}
488+
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ static void ExecutePass(RasterCommandBuffer cmd, PassData data, RendererList ren
7373
cmd.SetGlobalTexture(ShaderPropertyId.screenSpaceIrradiance, data.screenSpaceIrradianceHdl);
7474
}
7575

76+
#if URP_SCREEN_SPACE_REFLECTION
77+
bool useSSR = data.screenSpaceReflectionHdl.IsValid();
78+
cmd.SetKeyword(ShaderGlobalKeywords.ScreenSpaceReflection, useSSR);
79+
if (useSSR)
80+
{
81+
cmd.SetGlobalTexture(ShaderPropertyId.screenSpaceReflection, data.screenSpaceReflectionHdl);
82+
}
83+
#endif
84+
7685
cmd.DrawRendererList(rendererList);
7786

7887
// Render objects that did not match any shader pass with error shader
@@ -93,6 +102,9 @@ private class PassData
93102
internal RendererListHandle objectsWithErrorRendererListHdl;
94103

95104
internal TextureHandle screenSpaceIrradianceHdl;
105+
#if URP_SCREEN_SPACE_REFLECTION
106+
internal TextureHandle screenSpaceReflectionHdl;
107+
#endif
96108
}
97109

98110
private void InitRendererLists( ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, uint batchLayerMask = uint.MaxValue)
@@ -152,6 +164,19 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, bool s
152164
builder.UseTexture(irradianceTexture, AccessFlags.Read);
153165
}
154166

167+
#if URP_SCREEN_SPACE_REFLECTION
168+
TextureHandle ssrTexture = resourceData.ssrTexture;
169+
if (ssrTexture.IsValid())
170+
{
171+
passData.screenSpaceReflectionHdl = ssrTexture;
172+
builder.UseTexture(ssrTexture, AccessFlags.Read);
173+
}
174+
else
175+
{
176+
passData.screenSpaceReflectionHdl = TextureHandle.nullHandle;
177+
}
178+
#endif
179+
155180
RenderGraphUtils.UseDBufferIfValid(builder, resourceData);
156181

157182
builder.SetRenderAttachmentDepth(cameraDepth, AccessFlags.ReadWrite);

Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/ScreenSpaceReflectionRendererFeature/ScreenSpaceReflectionPass.cs

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -140,22 +140,18 @@ internal bool Setup(ScriptableRenderer renderer, Material material, bool afterOp
140140
renderPassEvent = m_AfterOpaque ? (settings.ShouldRenderTransparents() ? RenderPassEvent.AfterRenderingTransparents + 25 : RenderPassEvent.AfterRenderingSkybox + 25) : RenderPassEvent.AfterRenderingPrePasses + 5;
141141

142142
requiredInputs = ScriptableRenderPassInput.Depth | ScriptableRenderPassInput.Normal;
143-
144-
// Deferred rendering before opaques, need to generate smoothness in depth normals prepass as GBuffer isn't ready yet.
145-
if (!m_AfterOpaque)
146-
renderingData.writesSmoothnessToDepthNormalsAlpha = true;
147143
}
148144
else
149145
{
150146
renderPassEvent = m_AfterOpaque ? (settings.ShouldRenderTransparents() ? RenderPassEvent.AfterRenderingTransparents + 25 : RenderPassEvent.BeforeRenderingTransparents + 25) : RenderPassEvent.AfterRenderingPrePasses + 5;
151147

152148
// Request DepthNormals texture.
153149
requiredInputs = ScriptableRenderPassInput.Depth | ScriptableRenderPassInput.Normal;
154-
155-
// With forward rendering, we are forced to generate a smoothness in depth normals prepass.
156-
renderingData.writesSmoothnessToDepthNormalsAlpha = true;
157150
}
158151

152+
// Write smoothness to alpha of depth normals texture so we can sample it in SSR pass.
153+
renderingData.writesSmoothnessToDepthNormalsAlpha = true;
154+
159155
// Before opaque needs motion vectors for reprojection.
160156
if (!m_AfterOpaque && (cameraType == CameraType.VR || cameraType == CameraType.Game))
161157
requiredInputs |= ScriptableRenderPassInput.Motion;
@@ -351,14 +347,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer
351347
}
352348
}
353349

354-
// If running before opaque pass, we need to export the SSR texture as a global uniform,
355-
// so it can be sampled in the opaque pass.
356-
if (!passData.afterOpaque)
357-
{
358-
builder.UseTexture(finalTexture, AccessFlags.ReadWrite);
359-
builder.SetGlobalTextureAfterPass(finalTexture, ShaderConstants._ScreenSpaceReflectionFinalTexture);
360-
}
361-
362350
builder.SetRenderFunc<ScreenSpaceReflectionPassData>(static (ssrData, rgContext) =>
363351
{
364352
SetupKeywordsAndParameters(ref ssrData);
@@ -385,7 +373,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer
385373
if (!ssrData.afterOpaque)
386374
{
387375
// We only want URP shaders to sample SSR if After Opaque is disabled...
388-
cmd.SetKeyword(ShaderGlobalKeywords.ScreenSpaceReflection, true);
389376
cmd.SetGlobalVector(ShaderConstants._ReflectionParam, new Vector4(1f, ssrData.minimumSmoothness, ssrData.smoothnessFadeStart, 0f));
390377
}
391378
});
@@ -454,6 +441,12 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer
454441
}
455442
}
456443
}
444+
445+
// Set global texture so subsequent passes can read it.
446+
if (m_AfterOpaque)
447+
resourceData.ssrTexture = TextureHandle.nullHandle;
448+
else
449+
resourceData.ssrTexture = finalTexture;
457450
}
458451

459452
static void SetupKeywordsAndParameters(ref ScreenSpaceReflectionPassData data)
@@ -626,16 +619,6 @@ private void CreateRenderTextureHandles(
626619
else
627620
depthPyramidTexture = TextureHandle.nullHandle;
628621
}
629-
630-
/// <inheritdoc/>
631-
public override void OnCameraCleanup(CommandBuffer cmd)
632-
{
633-
if (cmd == null)
634-
throw new ArgumentNullException(nameof(cmd));
635-
636-
if (!m_AfterOpaque)
637-
cmd.SetKeyword(ShaderGlobalKeywords.ScreenSpaceReflection, false);
638-
}
639622
}
640623
}
641624
#endif

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,9 @@ internal static class ShaderPropertyId
857857
public static readonly int hdrOutputGradingParams = Shader.PropertyToID("_HDROutputGradingParams");
858858
public static readonly int offscreenUIViewportParams = Shader.PropertyToID("_OffscreenUIViewportParams");
859859
public static readonly int screenSpaceIrradiance = Shader.PropertyToID("_ScreenSpaceIrradiance");
860+
#if URP_SCREEN_SPACE_REFLECTION
861+
public static readonly int screenSpaceReflection = Shader.PropertyToID("_ScreenSpaceReflectionTexture");
862+
#endif
860863
}
861864

862865
/// <summary>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,11 @@ private void OnMainRendering(RenderGraph renderGraph, ScriptableRenderContext co
12871287
if (needTransparencyPass)
12881288
#endif
12891289
{
1290+
#if URP_SCREEN_SPACE_REFLECTION
1291+
var ssrSettings = VolumeManager.instance.stack.GetComponent<ScreenSpaceReflectionVolumeSettings>();
1292+
m_RenderTransparentForwardPass.shouldTransparentsReceiveSSR = ssrSettings.ShouldRenderTransparents();
1293+
#endif
1294+
12901295
m_RenderTransparentForwardPass.m_ShouldTransparentsReceiveShadows = !m_TransparentSettingsPass.Setup();
12911296
m_RenderTransparentForwardPass.Render(
12921297
renderGraph,

0 commit comments

Comments
 (0)