Skip to content

Commit 4403a18

Browse files
Mikkel SimonsenEvergreen
authored andcommitted
Fix bug where _WRITE_RENDERING_LAYERS is stripped from incorrect pass
Fixed an issue where _WRITE_RENDERING_LAYERS shader variant is stripped from DepthNormal prepass in URP Forward+ when it should not be, resulting in decals not rendering because the rendering layers texture is clear. https://jira.unity3d.com/browse/UUM-72315
1 parent 92be9b6 commit 4403a18

File tree

4 files changed

+49
-45
lines changed

4 files changed

+49
-45
lines changed

Packages/com.unity.render-pipelines.universal/Editor/ShaderBuildPreprocessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,11 @@ internal static ShaderFeatures GetSupportedShaderFeaturesFromRendererFeatures(re
682682
continue;
683683

684684
// Rendering Layers...
685-
if (rendererRequirements.isUniversalRenderer && rendererFeature.RequireRenderingLayers(isDeferredRenderer, rendererRequirements.needsGBufferAccurateNormals, out RenderingLayerUtils.Event rendererEvent, out _))
685+
if (rendererRequirements.isUniversalRenderer &&
686+
RenderingLayerUtils.RequireRenderingLayers(rendererFeatures,
687+
rendererRequirements.renderingMode,
688+
rendererRequirements.needsGBufferAccurateNormals,
689+
rendererRequirements.msaaSampleCount, out RenderingLayerUtils.Event rendererEvent, out _))
686690
{
687691
usesRenderingLayers = true;
688692
RenderingLayerUtils.CombineRendererEvents(isDeferredRenderer, rendererRequirements.msaaSampleCount, rendererEvent, ref renderingLayersEvent);

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

Lines changed: 12 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -34,65 +34,34 @@ public static void CombineRendererEvents(bool isDeferred, int msaaSampleCount, E
3434
combinedEvent = Combine(combinedEvent, rendererEvent);
3535
}
3636

37-
/// <summary>
38-
/// Returns True if <see cref="UniversalRendererData"/> will require rendering layers texture.
39-
/// </summary>
40-
/// <param name="universalRendererData"></param>
41-
/// <param name="msaaSampleCount">Event at which rendering layers texture needs to be created</param>
42-
/// <param name="combinedEvent">Event at which rendering layers texture needs to be created</param>
43-
/// <param name="combinedMaskSize">The mask size of rendering layers texture</param>
44-
public static bool RequireRenderingLayers(UniversalRendererData universalRendererData, int msaaSampleCount, out Event combinedEvent, out MaskSize combinedMaskSize)
45-
{
46-
combinedEvent = Event.Opaque;
47-
combinedMaskSize = MaskSize.Bits8;
48-
49-
bool isDeferred = universalRendererData.renderingMode == RenderingMode.Deferred;
50-
bool result = false;
51-
foreach (var rendererFeature in universalRendererData.rendererFeatures)
52-
{
53-
if (rendererFeature.isActive)
54-
{
55-
result |= rendererFeature.RequireRenderingLayers(isDeferred, universalRendererData.accurateGbufferNormals, out Event rendererEvent, out MaskSize rendererMaskSize);
56-
combinedEvent = Combine(combinedEvent, rendererEvent);
57-
combinedMaskSize = Combine(combinedMaskSize, rendererMaskSize);
58-
}
59-
}
60-
61-
// Rendering layers can not use MSAA resolve, because it encodes integer
62-
if (msaaSampleCount > 1 && combinedEvent == Event.Opaque && !isDeferred)
63-
combinedEvent = Event.DepthNormalPrePass;
64-
65-
// Make sure texture has enough bits to encode all rendering layers in urp global settings
66-
if (UniversalRenderPipelineGlobalSettings.instance)
67-
{
68-
int count = RenderingLayerMask.GetRenderingLayerCount();
69-
MaskSize maskSize = GetMaskSize(count);
70-
combinedMaskSize = Combine(combinedMaskSize, maskSize);
71-
}
72-
73-
return result;
74-
}
75-
7637
/// <summary>
7738
/// Returns True if <see cref="UniversalRenderer"/> will require rendering layers texture.
7839
/// </summary>
7940
/// <param name="universalRenderer"></param>
80-
/// <param name="rendererFeatures">Event at which rendering layers texture needs to be created</param>
81-
/// <param name="msaaSampleCount">Event at which rendering layers texture needs to be created</param>
41+
/// <param name="rendererFeatures">List of renderer features used by the renderer</param>
42+
/// <param name="msaaSampleCount">MSAA sample count</param>
8243
/// <param name="combinedEvent">Event at which rendering layers texture needs to be created</param>
8344
/// <param name="combinedMaskSize">The mask size of rendering layers texture</param>
8445
public static bool RequireRenderingLayers(UniversalRenderer universalRenderer, List<ScriptableRendererFeature> rendererFeatures, int msaaSampleCount, out Event combinedEvent, out MaskSize combinedMaskSize)
46+
{
47+
RenderingMode renderingMode = universalRenderer.renderingModeActual;
48+
bool accurateGBufferNormals = universalRenderer.accurateGbufferNormals;
49+
return RequireRenderingLayers(rendererFeatures, renderingMode, accurateGBufferNormals, msaaSampleCount,
50+
out combinedEvent, out combinedMaskSize);
51+
}
52+
53+
internal static bool RequireRenderingLayers(List<ScriptableRendererFeature> rendererFeatures, RenderingMode renderingMode, bool accurateGbufferNormals, int msaaSampleCount, out Event combinedEvent, out MaskSize combinedMaskSize)
8554
{
8655
combinedEvent = Event.Opaque;
8756
combinedMaskSize = MaskSize.Bits8;
8857

89-
bool isDeferred = universalRenderer.renderingModeActual == RenderingMode.Deferred;
58+
bool isDeferred = renderingMode == RenderingMode.Deferred;
9059
bool result = false;
9160
foreach (var rendererFeature in rendererFeatures)
9261
{
9362
if (rendererFeature.isActive)
9463
{
95-
result |= rendererFeature.RequireRenderingLayers(isDeferred, universalRenderer.accurateGbufferNormals, out Event rendererEvent, out MaskSize rendererMaskSize);
64+
result |= rendererFeature.RequireRenderingLayers(isDeferred, accurateGbufferNormals, out Event rendererEvent, out MaskSize rendererMaskSize);
9665
combinedEvent = Combine(combinedEvent, rendererEvent);
9766
combinedMaskSize = Combine(combinedMaskSize, rendererMaskSize);
9867
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ void SetupRenderingLayers(int msaaSamples)
675675
m_RequiresRenderingLayer = RenderingLayerUtils.RequireRenderingLayers(this, rendererFeatures, msaaSamples,
676676
out m_RenderingLayersEvent, out m_RenderingLayersMaskSize);
677677

678-
m_RenderingLayerProvidesRenderObjectPass = m_RequiresRenderingLayer && renderingModeActual == RenderingMode.Forward && m_RenderingLayersEvent == RenderingLayerUtils.Event.Opaque;
678+
m_RenderingLayerProvidesRenderObjectPass = m_RequiresRenderingLayer && m_RenderingLayersEvent == RenderingLayerUtils.Event.Opaque;
679679
m_RenderingLayerProvidesByDepthNormalPass = m_RequiresRenderingLayer && m_RenderingLayersEvent == RenderingLayerUtils.Event.DepthNormalPrePass;
680680

681681
if (m_DeferredLights != null)

Packages/com.unity.render-pipelines.universal/Tests/Editor/ShaderBuildPreprocessorTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,37 @@ public void TestGetSupportedShaderFeaturesFromRendererFeatures_RenderingLayers(
814814
actual = m_TestHelper.GetSupportedShaderFeaturesFromRendererFeatures(rendererRequirements);
815815
expected = ShaderFeatures.DecalGBuffer | ShaderFeatures.DecalNormalBlendLow | ShaderFeatures.DecalLayers | ShaderFeatures.DepthNormalPassRenderingLayers | ShaderFeatures.GBufferWriteRenderingLayers;
816816
m_TestHelper.AssertShaderFeaturesAndReset(expected, actual);
817+
818+
// Test with DepthNormal prepass enabled (Is enabled implicitly by SSAO f.ex)
819+
ScreenSpaceAmbientOcclusion ssaoFeature = ScriptableObject.CreateInstance<ScreenSpaceAmbientOcclusion>();
820+
ssaoFeature.settings = new ScreenSpaceAmbientOcclusionSettings()
821+
{
822+
AOMethod = ScreenSpaceAmbientOcclusionSettings.AOMethodOptions.BlueNoise,
823+
Downsample = false,
824+
AfterOpaque = false,
825+
Source = ScreenSpaceAmbientOcclusionSettings.DepthSource.DepthNormals,
826+
NormalSamples = ScreenSpaceAmbientOcclusionSettings.NormalQuality.Medium,
827+
Intensity = 3.0f,
828+
DirectLightingStrength = 0.25f,
829+
Radius = 0.035f,
830+
Samples = ScreenSpaceAmbientOcclusionSettings.AOSampleOption.Medium,
831+
BlurQuality = ScreenSpaceAmbientOcclusionSettings.BlurQualityOptions.High,
832+
Falloff = 100f,
833+
};
834+
ssaoFeature.SetActive(true);
835+
m_TestHelper.rendererFeatures.Add(ssaoFeature);
836+
837+
((DecalRendererFeature)m_TestHelper.rendererFeatures[0]).settings.technique = DecalTechniqueOption.ScreenSpace;
838+
((DecalRendererFeature)m_TestHelper.rendererFeatures[0]).settings.decalLayers = true;
839+
rendererRequirements = m_TestHelper.defaultRendererRequirements;
840+
rendererRequirements.needsUnusedVariants = false;
841+
actual = m_TestHelper.GetSupportedShaderFeaturesFromRendererFeatures(rendererRequirements);
842+
expected = ShaderFeatures.ScreenSpaceOcclusion | ShaderFeatures.DecalScreenSpace |
843+
ShaderFeatures.DecalNormalBlendLow | ShaderFeatures.DecalLayers |
844+
ShaderFeatures.DepthNormalPassRenderingLayers;
845+
m_TestHelper.AssertShaderFeaturesAndReset(expected, actual);
846+
847+
m_TestHelper.rendererFeatures.Remove(ssaoFeature);
817848
}
818849

819850
[Test]

0 commit comments

Comments
 (0)