Skip to content

Commit d4a9a45

Browse files
kennytannEvergreen
authored andcommitted
[UUM-134522][UUM-136056][URP 2D][6000.6] Fix 2d shadow volumetric bugs
1 parent 18bdad7 commit d4a9a45

6 files changed

Lines changed: 24 additions & 5 deletions

File tree

Packages/com.unity.render-pipelines.universal/Runtime/2D/Lights/Light2DCullResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public LightStats GetLightStatsByLayer(int layerID, ref LayerBatch layer)
7474
returnStats.totalNormalMapUsage++;
7575
if (light.volumeIntensity > 0 && light.volumetricEnabled)
7676
returnStats.totalVolumetricUsage++;
77-
if (light.volumeIntensity > 0 && light.volumetricEnabled && RendererLighting.CanCastShadows(light, layerID))
77+
if (RendererLighting.CanCastVolumetricShadows(light, layer.endLayerValue))
7878
returnStats.totalVolumetricShadowUsage++;
7979

8080
returnStats.blendStylesUsed |= (uint)(1 << light.blendStyleIndex);

Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/RendererLighting.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ internal static bool CanCastShadows(Light2D light, int layerToRender)
153153
return light.shadowsEnabled && light.shadowIntensity > 0 && light.IsLitLayer(layerToRender);
154154
}
155155

156+
internal static bool CanCastVolumetricShadows(Light2D light, int endLayerValue)
157+
{
158+
return light.volumeIntensity > 0 && light.volumetricEnabled && light.renderVolumetricShadows && light.GetTopMostLitLayer() == endLayerValue;
159+
}
160+
156161
internal static void SetLightShaderGlobals(IRasterCommandBuffer cmd, Light2DBlendStyle[] lightBlendStyles, int[] blendStyleIndices)
157162
{
158163
for (var i = 0; i < blendStyleIndices.Length; i++)

Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ private static void Execute(RasterCommandBuffer cmd, PassData passData, LayerBat
8686
layerBatch.endLayerValue != light.GetTopMostLitLayer()))
8787
continue;
8888

89-
var useShadows = passData.layerBatch.lightStats.useShadows && layerBatch.shadowIndices.Contains(j);
89+
var useShadows = (!passData.isVolumetric && passData.layerBatch.lightStats.useShadows) || (passData.isVolumetric && passData.layerBatch.lightStats.useVolumetricShadowLights);
90+
useShadows &= layerBatch.shadowIndices.Contains(j);
9091
var lightMaterial = passData.rendererData.GetLightMaterial(light, passData.isVolumetric, useShadows);
9192
var lightMesh = light.lightMesh;
9293

Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal class PassData
3333
internal Renderer2DData rendererData;
3434
internal TextureHandle[] shadowTextures;
3535
internal TextureHandle shadowDepth;
36+
internal bool isVolumetric;
3637
}
3738

3839
public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex, bool isVolumetric = false)
@@ -52,6 +53,7 @@ public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex
5253

5354
using (var builder = graph.AddUnsafePass<PassData>(passName, out var passData, LayerDebug.GetProfilingSampler(passName, profilingSampler)))
5455
{
56+
passData.isVolumetric = isVolumetric;
5557
passData.layerBatch = layerBatch;
5658
passData.rendererData = rendererData;
5759
passData.shadowTextures = universal2DResourceData.shadowTextures[batchIndex];
@@ -72,6 +74,9 @@ public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex
7274
var index = data.layerBatch.shadowIndices[i];
7375
var light = data.layerBatch.lights[index];
7476

77+
if (data.isVolumetric && !RendererLighting.CanCastVolumetricShadows(light, data.layerBatch.endLayerValue))
78+
continue;
79+
7580
// Shadow Pass
7681
ExecuteShadowPass(cmd, data, light, i);
7782
}

Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,13 @@ private RenderPassInputSummary GetRenderPassInputs()
207207
inputSummary.requiresColorTexture |= needsColor;
208208
}
209209

210+
// Volumetric shadow pass requires intermediate texture
211+
bool hasVolumetricShadowPass = false;
212+
var layerBatches = frameData.Get<Universal2DRenderingData>().layerBatches;
213+
var batchCount = frameData.Get<Universal2DRenderingData>().batchCount;
214+
for (int i = 0; i < batchCount; ++i)
215+
hasVolumetricShadowPass |= layerBatches[i].lightStats.useVolumetricShadowLights;
216+
210217
inputSummary.requiresColorTexture |= cameraData.postProcessEnabled
211218
|| cameraData.isHdrEnabled
212219
|| cameraData.isSceneViewCamera
@@ -217,7 +224,8 @@ private RenderPassInputSummary GetRenderPassInputs()
217224
|| m_Renderer2DData.useCameraSortingLayerTexture
218225
|| !Mathf.Approximately(cameraData.renderScale, 1.0f)
219226
|| (DebugHandler != null && DebugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget))
220-
|| cameraData.captureActions != null;
227+
|| cameraData.captureActions != null
228+
|| hasVolumetricShadowPass;
221229

222230
return inputSummary;
223231
}

Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/LightingUtility.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@
5959
if(intensity < 1)\
6060
{\
6161
half4 shadowTex = SAMPLE_TEXTURE2D(_ShadowTex, sampler_ShadowTex, input.shadowUV); \
62-
half4 shadowIntensity = 1-max(shadowTex.r, shadowTex.g * 1-shadowTex.b);\
63-
color.rgb = (color.rgb * shadowIntensity.rgb) + (color.rgb * intensity*(1 - shadowIntensity.rgb));\
62+
half shadowIntensity = 1 - max(shadowTex.r, shadowTex.g * (1 - shadowTex.b));\
63+
color.rgb = (color.rgb * shadowIntensity) + (color.rgb * intensity * (1 - shadowIntensity));\
6464
}
6565

6666
#define TRANSFER_SHADOWS(output)\

0 commit comments

Comments
 (0)