Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
e48000c
(Experimental) Adding strip off variants for additional lights and ma…
lukaschod Sep 7, 2021
329e1e0
Adding back check
lukaschod Sep 7, 2021
fad0197
Fix for main light with no shadows
lukaschod Sep 8, 2021
c83a916
Adding fake main light and fake additional light for disabled variants
lukaschod Sep 13, 2021
71aa88b
Removing additional light shadows multi compile for paritcles deferre…
lukaschod Sep 20, 2021
6650adc
Adding shadow strip off variant control
lukaschod Sep 21, 2021
288f497
Adding fake passes to custom renderer
lukaschod Sep 21, 2021
05e364f
Adding empty main light shadows and empty additional shadows code pat…
lukaschod Sep 23, 2021
5d863c7
Fix for additional lights and main light to work with empty pass setup
lukaschod Sep 24, 2021
4af037a
Fixing additional light check to use lightdata instead of urp asset
lukaschod Sep 27, 2021
3fcaa1c
cleanup
lukaschod Sep 27, 2021
c6cde5d
Merge branch 'master' of github.com:Unity-Technologies/Graphics into …
lukaschod Sep 28, 2021
9264db5
Changing empty shadow function names to more clear ones
lukaschod Sep 29, 2021
6a6d49d
Spliting stripShadowsOffVariants into stripShadowsOffVariants and str…
lukaschod Sep 29, 2021
7d94653
Leftover
lukaschod Sep 29, 2021
48ce09e
Merge branch 'master' of github.com:Unity-Technologies/Graphics into …
lukaschod Sep 30, 2021
dd217e3
Moving setup empty passes to automatic setup
lukaschod Oct 4, 2021
b0194ab
Merge branch 'master' of github.com:Unity-Technologies/Graphics into …
lukaschod Oct 4, 2021
5d4c7e3
Adding empty pass setup for additional light shadows
lukaschod Oct 5, 2021
bc8551d
Merge branch 'universal/staging' into universal/strip-off-shadows-add…
phi-lira Oct 6, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions com.unity.render-pipelines.universal/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Added public api and updated docs for Light2D shape properties.
- Added Depth Texture setting for Overlay Camera.
- Added Depth Priming support for Vulkan with MSAA.
- Added Shadows and Additional Lights off variants stripping.

### Changed

Expand All @@ -31,6 +32,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
### Changed
- Removed experimental tile deferred code.
- VFX: New shadergraph support directly on Universal target.
- Main light shadow, additional light shadow and additional light keywords are now enabled based on urp setting instead of existence in scene. This allows better variant stripping.

### Fixed
- Added warning for lit shader detailed abledo, if texture is not linear. [1342011](https://issuetracker.unity3d.com/issues/detail-maps-packed-differently-in-built-in-vs-urp)
Expand Down
59 changes: 46 additions & 13 deletions com.unity.render-pipelines.universal/Editor/ShaderPreprocessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ enum ShaderFeatures
MainLightShadowsCascade = (1 << 26),
DrawProcedural = (1 << 27),
ScreenSpaceOcclusionAfterOpaque = (1 << 28),
AdditionalLightsKeepOffVariants = (1 << 29),
ShadowsKeepOffVariants = (1 << 30),
}

[Flags]
Expand Down Expand Up @@ -358,12 +360,22 @@ bool StripUnusedFeatures(ShaderFeatures features, Shader shader, ShaderSnippetDa
var stripTool = new StripTool<ShaderFeatures>(features, shader, snippetData, compilerData.shaderKeywordSet, stripUnusedVariants);

// strip main light shadows, cascade and screen variants
// TODO: Strip disabled keyword once no light will re-use same variant
if (stripTool.StripMultiCompileKeepOffVariant(
m_MainLightShadows, ShaderFeatures.MainLightShadows,
m_MainLightShadowsCascades, ShaderFeatures.MainLightShadowsCascade,
m_MainLightShadowsScreen, ShaderFeatures.ScreenSpaceShadows))
return true;
if (IsFeatureEnabled(ShaderFeatures.ShadowsKeepOffVariants, features))
{
if (stripTool.StripMultiCompileKeepOffVariant(
m_MainLightShadows, ShaderFeatures.MainLightShadows,
m_MainLightShadowsCascades, ShaderFeatures.MainLightShadowsCascade,
m_MainLightShadowsScreen, ShaderFeatures.ScreenSpaceShadows))
return true;
}
else
{
if (stripTool.StripMultiCompile(
m_MainLightShadows, ShaderFeatures.MainLightShadows,
m_MainLightShadowsCascades, ShaderFeatures.MainLightShadowsCascade,
m_MainLightShadowsScreen, ShaderFeatures.ScreenSpaceShadows))
return true;
}

// TODO: Strip off variants once we have global soft shadows option for forcing instead as support
if (stripTool.StripMultiCompileKeepOffVariant(m_SoftShadows, ShaderFeatures.SoftShadows))
Expand Down Expand Up @@ -400,9 +412,16 @@ bool StripUnusedFeatures(ShaderFeatures features, Shader shader, ShaderSnippetDa
return true;

// No additional light shadows
// TODO: Strip off variants once we support no shadow lights re-use same variant
if (stripTool.StripMultiCompileKeepOffVariant(m_AdditionalLightShadows, ShaderFeatures.AdditionalLightShadows))
return true;
if (IsFeatureEnabled(ShaderFeatures.ShadowsKeepOffVariants, features))
{
if (stripTool.StripMultiCompileKeepOffVariant(m_AdditionalLightShadows, ShaderFeatures.AdditionalLightShadows))
return true;
}
else
{
if (stripTool.StripMultiCompile(m_AdditionalLightShadows, ShaderFeatures.AdditionalLightShadows))
return true;
}

if (stripTool.StripMultiCompile(m_ReflectionProbeBlending, ShaderFeatures.ReflectionProbeBlending))
return true;
Expand All @@ -425,10 +444,18 @@ bool StripUnusedFeatures(ShaderFeatures features, Shader shader, ShaderSnippetDa
}

// Additional light are shaded per-vertex or per-pixel.
// TODO: Strip off variants once we support no additional lights re-used variants
if (stripTool.StripMultiCompileKeepOffVariant(m_AdditionalLightsVertex, ShaderFeatures.VertexLighting,
m_AdditionalLightsPixel, ShaderFeatures.AdditionalLights))
return true;
if (IsFeatureEnabled(ShaderFeatures.AdditionalLightsKeepOffVariants, features))
{
if (stripTool.StripMultiCompileKeepOffVariant(m_AdditionalLightsVertex, ShaderFeatures.VertexLighting,
m_AdditionalLightsPixel, ShaderFeatures.AdditionalLights))
return true;
}
else
{
if (stripTool.StripMultiCompile(m_AdditionalLightsVertex, ShaderFeatures.VertexLighting,
m_AdditionalLightsPixel, ShaderFeatures.AdditionalLights))
return true;
}

if (stripTool.StripMultiCompile(m_ClusteredRendering, ShaderFeatures.ClusteredRendering))
return true;
Expand Down Expand Up @@ -921,6 +948,12 @@ private static ShaderFeatures GetSupportedShaderFeatures(UniversalRenderPipeline
}
}

if (!renderer.stripShadowsOffVariants)
shaderFeatures |= ShaderFeatures.ShadowsKeepOffVariants;

if (!renderer.stripAdditionalLightOffVariants)
shaderFeatures |= ShaderFeatures.AdditionalLightsKeepOffVariants;

var rendererClustered = false;

ScriptableRendererData rendererData = pipelineAsset.m_RendererDataList[rendererIndex];
Expand Down
5 changes: 3 additions & 2 deletions com.unity.render-pipelines.universal/Runtime/ForwardLights.cs
Original file line number Diff line number Diff line change
Expand Up @@ -353,10 +353,11 @@ public void Setup(ScriptableRenderContext context, ref RenderingData renderingDa

SetupShaderLightConstants(cmd, ref renderingData);

bool lightCountCheck = (renderingData.cameraData.renderer.stripAdditionalLightOffVariants && renderingData.lightData.supportsAdditionalLights) || additionalLightsCount > 0;
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.AdditionalLightsVertex,
additionalLightsCount > 0 && additionalLightsPerVertex && !useClusteredRendering);
lightCountCheck && additionalLightsPerVertex && !useClusteredRendering);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.AdditionalLightsPixel,
additionalLightsCount > 0 && !additionalLightsPerVertex && !useClusteredRendering);
lightCountCheck && !additionalLightsPerVertex && !useClusteredRendering);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.ClusteredRendering,
useClusteredRendering);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ public ShadowResolutionRequest(int _visibleLightIndex, int _perLightShadowSliceI
}
}

/// <summary>
/// x is used in RenderAdditionalShadowMapAtlas to skip shadow map rendering for non-shadow-casting lights.
/// w is perLightFirstShadowSliceIndex, used in Lighting shader to find if Additional light casts shadows.
/// </summary>
readonly static Vector4 c_DefaultShadowParams = new Vector4(0, 0, 0, -1);

static int m_AdditionalLightsWorldToShadow_SSBO;
static int m_AdditionalShadowParams_SSBO;
bool m_UseStructuredBuffer;
Expand Down Expand Up @@ -76,6 +82,8 @@ public ShadowResolutionRequest(int _visibleLightIndex, int _perLightShadowSliceI
int[] m_VisibleLightIndexToSortedShadowResolutionRequestsFirstSliceIndex = null; // for each visible light, store the index of its first shadow slice in m_SortedShadowResolutionRequests (for quicker access)
List<RectInt> m_UnusedAtlasSquareAreas = new List<RectInt>(); // this list tracks space available in the atlas

bool m_CreateEmptyShadowmap;

bool m_SupportsBoxFilterForShadows;
ProfilingSampler m_ProfilingSetupSampler = new ProfilingSampler("Setup Additional Shadows");

Expand Down Expand Up @@ -608,11 +616,8 @@ public bool Setup(ref RenderingData renderingData)
m_AdditionalLightShadowSliceIndexTo_WorldShadowMatrix = new Matrix4x4[totalShadowSlicesCount];

// initialize _AdditionalShadowParams
Vector4 defaultShadowParams = new Vector4(0 /*shadowStrength*/, 0, 0, -1 /*perLightFirstShadowSliceIndex*/);
// shadowParams.x is used in RenderAdditionalShadowMapAtlas to skip shadow map rendering for non-shadow-casting lights
// shadowParams.w is used in Lighting shader to find if Additional light casts shadows
for (int i = 0; i < maxAdditionalLightShadowParams; ++i)
m_AdditionalLightIndexToShadowParams[i] = defaultShadowParams;
m_AdditionalLightIndexToShadowParams[i] = c_DefaultShadowParams;

int validShadowCastingLightsCount = 0;
bool supportsSoftShadows = renderingData.shadowData.supportsSoftShadows;
Expand Down Expand Up @@ -731,7 +736,7 @@ public bool Setup(ref RenderingData renderingData)

// Lights that need to be rendered in the shadow map atlas
if (validShadowCastingLightsCount == 0)
return false;
return SetupForEmptyRendering(ref renderingData);

int shadowCastingLightsBufferCount = m_ShadowSliceToAdditionalLightIndex.Count;

Expand Down Expand Up @@ -786,6 +791,24 @@ public bool Setup(ref RenderingData renderingData)
m_AdditionalLightsShadowmapTexture = ShadowUtils.GetTemporaryShadowTexture(renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits);
m_MaxShadowDistanceSq = renderingData.cameraData.maxShadowDistance * renderingData.cameraData.maxShadowDistance;
m_CascadeBorder = renderingData.shadowData.mainLightShadowCascadeBorder;
m_CreateEmptyShadowmap = false;
useNativeRenderPass = true;

return true;
}

bool SetupForEmptyRendering(ref RenderingData renderingData)
{
if (!renderingData.cameraData.renderer.stripShadowsOffVariants)
return false;

m_AdditionalLightsShadowmapTexture = ShadowUtils.GetTemporaryShadowTexture(1, 1, k_ShadowmapBufferBits);
m_CreateEmptyShadowmap = true;
useNativeRenderPass = false;

// initialize _AdditionalShadowParams
for (int i = 0; i < m_AdditionalLightIndexToShadowParams.Length; ++i)
m_AdditionalLightIndexToShadowParams[i] = c_DefaultShadowParams;

return true;
}
Expand All @@ -799,6 +822,12 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera
/// <inheritdoc/>
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (m_CreateEmptyShadowmap)
{
SetEmptyAdditionalShadowmapAtlas(ref context);
return;
}

if (renderingData.shadowData.supportsAdditionalLightShadows)
RenderAdditionalShadowmapAtlas(ref context, ref renderingData.cullResults, ref renderingData.lightData, ref renderingData.shadowData);
}
Expand Down Expand Up @@ -832,6 +861,24 @@ void Clear()
m_AdditionalLightsShadowmapTexture = null;
}

void SetEmptyAdditionalShadowmapAtlas(ref ScriptableRenderContext context)
{
CommandBuffer cmd = CommandBufferPool.Get();
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.AdditionalLightShadows, true);
if (RenderingUtils.useStructuredBuffer)
{
var shadowParamsBuffer = ShaderData.instance.GetAdditionalLightShadowParamsStructuredBuffer(m_AdditionalLightIndexToShadowParams.Length);
shadowParamsBuffer.SetData(m_AdditionalLightIndexToShadowParams);
cmd.SetGlobalBuffer(m_AdditionalShadowParams_SSBO, shadowParamsBuffer);
}
else
{
cmd.SetGlobalVectorArray(AdditionalShadowsConstantBuffer._AdditionalShadowParams, m_AdditionalLightIndexToShadowParams);
}
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}

void RenderAdditionalShadowmapAtlas(ref ScriptableRenderContext context, ref CullingResults cullResults, ref LightData lightData, ref ShadowData shadowData)
{
NativeArray<VisibleLight> visibleLights = lightData.visibleLights;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ private static class MainLightShadowConstantBuffer
ShadowSliceData[] m_CascadeSlices;
Vector4[] m_CascadeSplitDistances;

bool m_CreateEmptyShadowmap;

ProfilingSampler m_ProfilingSetupSampler = new ProfilingSampler("Setup Main Shadowmap");

public MainLightShadowCasterPass(RenderPassEvent evt)
Expand Down Expand Up @@ -71,17 +73,17 @@ public bool Setup(ref RenderingData renderingData)
using var profScope = new ProfilingScope(null, m_ProfilingSetupSampler);

if (!renderingData.shadowData.supportsMainLightShadows)
return false;
return SetupForEmptyRendering(ref renderingData);

Clear();
int shadowLightIndex = renderingData.lightData.mainLightIndex;
if (shadowLightIndex == -1)
return false;
return SetupForEmptyRendering(ref renderingData);

VisibleLight shadowLight = renderingData.lightData.visibleLights[shadowLightIndex];
Light light = shadowLight.light;
if (light.shadows == LightShadows.None)
return false;
return SetupForEmptyRendering(ref renderingData);

if (shadowLight.lightType != LightType.Directional)
{
Expand All @@ -90,7 +92,7 @@ public bool Setup(ref RenderingData renderingData)

Bounds bounds;
if (!renderingData.cullResults.GetShadowCasterBounds(shadowLightIndex, out bounds))
return false;
return SetupForEmptyRendering(ref renderingData);

m_ShadowCasterCascadesCount = renderingData.shadowData.mainLightShadowCascadesCount;

Expand All @@ -108,12 +110,26 @@ public bool Setup(ref RenderingData renderingData)
out m_CascadeSplitDistances[cascadeIndex], out m_CascadeSlices[cascadeIndex]);

if (!success)
return false;
return SetupForEmptyRendering(ref renderingData);
}

m_MainLightShadowmapTexture = ShadowUtils.GetTemporaryShadowTexture(renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits);
m_MaxShadowDistanceSq = renderingData.cameraData.maxShadowDistance * renderingData.cameraData.maxShadowDistance;
m_CascadeBorder = renderingData.shadowData.mainLightShadowCascadeBorder;
m_CreateEmptyShadowmap = false;
useNativeRenderPass = true;

return true;
}

bool SetupForEmptyRendering(ref RenderingData renderingData)
{
if (!renderingData.cameraData.renderer.stripShadowsOffVariants)
return false;

m_MainLightShadowmapTexture = ShadowUtils.GetTemporaryShadowTexture(1, 1, k_ShadowmapBufferBits);
m_CreateEmptyShadowmap = true;
useNativeRenderPass = false;

return true;
}
Expand All @@ -127,6 +143,12 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera
/// <inheritdoc/>
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (m_CreateEmptyShadowmap)
{
SetEmptyMainLightCascadeShadowmap(ref context);
return;
}

RenderMainLightCascadeShadowmap(ref context, ref renderingData.cullResults, ref renderingData.lightData, ref renderingData.shadowData);
}

Expand Down Expand Up @@ -157,6 +179,19 @@ void Clear()
m_CascadeSlices[i].Clear();
}

void SetEmptyMainLightCascadeShadowmap(ref ScriptableRenderContext context)
{
CommandBuffer cmd = CommandBufferPool.Get();
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.MainLightShadows, true);
cmd.SetGlobalTexture(m_MainLightShadowmap.id, m_MainLightShadowmapTexture);
cmd.SetGlobalVector(MainLightShadowConstantBuffer._ShadowParams,
new Vector4(1, 0, 1, 0));
cmd.SetGlobalVector(MainLightShadowConstantBuffer._ShadowmapSize,
new Vector4(1f / m_MainLightShadowmapTexture.width, 1f / m_MainLightShadowmapTexture.height, m_MainLightShadowmapTexture.width, m_MainLightShadowmapTexture.height));
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}

void RenderMainLightCascadeShadowmap(ref ScriptableRenderContext context, ref CullingResults cullResults, ref LightData lightData, ref ShadowData shadowData)
{
int shadowLightIndex = lightData.mainLightIndex;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,10 @@ internal static void ConfigureActiveTarget(RenderTargetIdentifier colorAttachmen

internal bool useDepthPriming { get; set; } = false;

internal bool stripShadowsOffVariants { get; set; } = false;

internal bool stripAdditionalLightOffVariants { get; set; } = false;

public ScriptableRenderer(ScriptableRendererData data)
{
if (Debug.isDebugBuild)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1100,6 +1100,7 @@ static void InitializeLightData(UniversalRenderPipelineAsset settings, NativeArr
lightData.maxPerObjectAdditionalLightsCount = 0;
}

lightData.supportsAdditionalLights = settings.additionalLightsRenderingMode != LightRenderingMode.Disabled;
lightData.shadeAdditionalLightsPerVertex = settings.additionalLightsRenderingMode == LightRenderingMode.PerVertex;
lightData.visibleLights = visibleLights;
lightData.supportsMixedLighting = settings.supportsMixedLighting;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ public struct LightData
public bool reflectionProbeBoxProjection;
public bool reflectionProbeBlending;
public bool supportsLightLayers;

/// <summary>
/// True if additional lights enabled.
/// </summary>
public bool supportsAdditionalLights;
}

public struct CameraData
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ public UniversalRenderer(UniversalRendererData data) : base(data)
m_LightCookieManager = new LightCookieManager(ref settings);
}

this.stripShadowsOffVariants = true;
this.stripAdditionalLightOffVariants = true;

ForwardLights.InitParams forwardInitParams;
forwardInitParams.lightCookieManager = m_LightCookieManager;
forwardInitParams.clusteredRendering = data.clusteredRendering;
Expand All @@ -179,6 +182,7 @@ public UniversalRenderer(UniversalRendererData data) : base(data)
// we inject the builtin passes in the before events.
m_MainLightShadowCasterPass = new MainLightShadowCasterPass(RenderPassEvent.BeforeRenderingShadows);
m_AdditionalLightsShadowCasterPass = new AdditionalLightsShadowCasterPass(RenderPassEvent.BeforeRenderingShadows);

#if ENABLE_VR && ENABLE_XR_MODULE
m_XROcclusionMeshPass = new XROcclusionMeshPass(RenderPassEvent.BeforeRenderingOpaques);
// Schedule XR copydepth right after m_FinalBlitPass(AfterRendering + 1)
Expand Down
Loading