diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs b/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs index b11558850a1..6f54406937c 100644 --- a/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs @@ -213,7 +213,7 @@ private int DrawLayerBatches( if (layerBatch.lightStats.totalNormalMapUsage > 0) { filterSettings.sortingLayerRange = layerBatch.layerRange; - var depthTarget = m_NeedsDepth ? depthAttachmentHandle.nameID : BuiltinRenderTextureType.None; + var depthTarget = false ? depthAttachmentHandle.nameID : BuiltinRenderTextureType.None; this.RenderNormals(context, renderingData, normalsDrawSettings, filterSettings, depthTarget, cmd, layerBatch.lightStats); } diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Passes/Renderer2DDepthFeature.cs b/com.unity.render-pipelines.universal/Runtime/2D/Passes/Renderer2DDepthFeature.cs new file mode 100644 index 00000000000..67ee5e1b894 --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/2D/Passes/Renderer2DDepthFeature.cs @@ -0,0 +1,49 @@ +using UnityEngine.Rendering.Universal.Internal; + +namespace UnityEngine.Rendering.Universal +{ + internal class Renderer2DDepthFeature : ScriptableRendererFeature + { + DepthOnlyPass m_DepthPrepass; + private CopyDepthPass m_CopyDepthPass; + RTHandle m_CameraDepthTexture; + [Reload("Shaders/Utils/CopyDepth.shader")] + public Shader copyDepthPS; + Material m_CopyDepthMaterial = null; + + public override void Create() + { + m_CopyDepthMaterial = CoreUtils.CreateEngineMaterial(copyDepthPS); + } + + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + m_DepthPrepass = new DepthOnlyPass(RenderPassEvent.BeforeRenderingPrePasses, RenderQueueRange.opaque, -1); + + ref var cameraData = ref renderingData.cameraData; + var cameraTargetDescriptor = cameraData.cameraTargetDescriptor; + + var renderer2DData = ((Renderer2D)renderer).GetRenderer2DData(); + cameraTargetDescriptor.width = (int)(cameraTargetDescriptor.width * renderer2DData.lightRenderTextureScale); + cameraTargetDescriptor.height = (int)(cameraTargetDescriptor.height * renderer2DData.lightRenderTextureScale); + + RenderingUtils.ReAllocateIfNeeded(ref m_CameraDepthTexture, cameraTargetDescriptor, FilterMode.Point, TextureWrapMode.Clamp, name: "_CameraDepthTexture"); + m_DepthPrepass.Setup(cameraTargetDescriptor, m_CameraDepthTexture); + m_DepthPrepass.sortingCriteriaOverride = SortingCriteria.QuantizedFrontToBack | + SortingCriteria.RenderQueue | + SortingCriteria.OptimizeStateChanges; + renderer.EnqueuePass(m_DepthPrepass); + + var depthTextureHandle = ((Renderer2D)renderer).GetDepthHandle(ref cameraData); + m_CopyDepthPass = new CopyDepthPass(RenderPassEvent.AfterRenderingPrePasses, m_CopyDepthMaterial); + m_CopyDepthPass.Setup(m_CameraDepthTexture, depthTextureHandle); + renderer.EnqueuePass(m_CopyDepthPass); + } + + protected override void Dispose(bool disposing) + { + if(disposing) + m_CameraDepthTexture?.Release(); + } + } +} diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Passes/Renderer2DDepthFeature.cs.meta b/com.unity.render-pipelines.universal/Runtime/2D/Passes/Renderer2DDepthFeature.cs.meta new file mode 100644 index 00000000000..011ddae58c7 --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/2D/Passes/Renderer2DDepthFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7d9860059bd554c09b889e785e3d52e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs b/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs index e287eaa0a5e..a8af45ccc53 100644 --- a/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs +++ b/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs @@ -36,6 +36,7 @@ internal class Renderer2D : ScriptableRenderer internal PostProcessPass finalPostProcessPass { get => m_PostProcessPasses.finalPostProcessPass; } internal RTHandle afterPostProcessColorHandle { get => m_PostProcessPasses.afterPostProcessColor; } internal RTHandle colorGradingLutHandle { get => m_PostProcessPasses.colorGradingLut; } + internal RTHandle depthAttachment { get => m_DepthTextureHandle; } public Renderer2D(Renderer2DData data) : base(data) { @@ -77,6 +78,18 @@ public Renderer2DData GetRenderer2DData() return m_Renderer2DData; } + internal RTHandle GetDepthHandle(ref CameraData cameraData) + { + ref var cameraTargetDescriptor = ref cameraData.cameraTargetDescriptor; + var depthDescriptor = cameraTargetDescriptor; + depthDescriptor.colorFormat = RenderTextureFormat.Depth; + depthDescriptor.depthBufferBits = 32; + if (!cameraData.resolveFinalTarget && m_UseDepthStencilBuffer) + depthDescriptor.bindMS = depthDescriptor.msaaSamples > 1 && !SystemInfo.supportsMultisampleAutoResolve && (SystemInfo.supportsMultisampledTextures != 0); + RenderingUtils.ReAllocateIfNeeded(ref m_DepthTextureHandle, depthDescriptor, FilterMode.Point, wrapMode: TextureWrapMode.Clamp, name: "_CameraDepthAttachment"); + return m_DepthTextureHandle; + } + void CreateRenderTextures( ref CameraData cameraData, bool forceCreateColorTexture, @@ -99,7 +112,8 @@ void CreateRenderTextures( || m_Renderer2DData.useCameraSortingLayerTexture || !Mathf.Approximately(cameraData.renderScale, 1.0f); - m_CreateDepthTexture = (!cameraData.resolveFinalTarget && m_UseDepthStencilBuffer) || createColorTexture; + // m_CreateDepthTexture = (!cameraData.resolveFinalTarget && m_UseDepthStencilBuffer) || createColorTexture; + m_CreateDepthTexture = m_UseDepthStencilBuffer; if (m_CreateColorTexture) { @@ -110,12 +124,7 @@ void CreateRenderTextures( if (m_CreateDepthTexture) { - var depthDescriptor = cameraTargetDescriptor; - depthDescriptor.colorFormat = RenderTextureFormat.Depth; - depthDescriptor.depthBufferBits = 32; - if (!cameraData.resolveFinalTarget && m_UseDepthStencilBuffer) - depthDescriptor.bindMS = depthDescriptor.msaaSamples > 1 && !SystemInfo.supportsMultisampleAutoResolve && (SystemInfo.supportsMultisampledTextures != 0); - RenderingUtils.ReAllocateIfNeeded(ref m_DepthTextureHandle, depthDescriptor, FilterMode.Point, wrapMode: TextureWrapMode.Clamp, name: "_CameraDepthAttachment"); + GetDepthHandle(ref cameraData); } colorTargetHandle = m_CreateColorTexture ? m_ColorTextureHandle : k_CameraTarget; diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs index cc8463e68a8..d3b54388389 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs @@ -17,6 +17,8 @@ public class DepthOnlyPass : ScriptableRenderPass private GraphicsFormat depthStencilFormat; internal ShaderTagId shaderTagId { get; set; } = k_ShaderTagId; + internal SortingCriteria? sortingCriteriaOverride { get; set; } = null; + FilteringSettings m_FilteringSettings; /// @@ -85,7 +87,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData context.ExecuteCommandBuffer(cmd); cmd.Clear(); - var sortFlags = renderingData.cameraData.defaultOpaqueSortFlags; + var sortFlags = sortingCriteriaOverride ?? renderingData.cameraData.defaultOpaqueSortFlags; var drawSettings = CreateDrawingSettings(this.shaderTagId, ref renderingData, sortFlags); drawSettings.perObjectData = PerObjectData.None; diff --git a/com.unity.render-pipelines.universal/Shaders/2D/Sprite-Lit-Default.shader b/com.unity.render-pipelines.universal/Shaders/2D/Sprite-Lit-Default.shader index b556007f12e..27f0202de6c 100644 --- a/com.unity.render-pipelines.universal/Shaders/2D/Sprite-Lit-Default.shader +++ b/com.unity.render-pipelines.universal/Shaders/2D/Sprite-Lit-Default.shader @@ -16,15 +16,16 @@ Shader "Universal Render Pipeline/2D/Sprite-Lit-Default" SubShader { - Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" } + Tags {"RenderPipeline" = "UniversalPipeline" } Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha Cull Off - ZWrite Off Pass { Tags { "LightMode" = "Universal2D" } + Tags {"Queue" = "Transparent" "RenderType" = "Transparent"} + ZWrite Off HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" @@ -120,6 +121,8 @@ Shader "Universal Render Pipeline/2D/Sprite-Lit-Default" Pass { Tags { "LightMode" = "NormalsRendering"} + Tags {"Queue" = "Transparent" "RenderType" = "Transparent"} + ZWrite Off HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" @@ -182,7 +185,68 @@ Shader "Universal Render Pipeline/2D/Sprite-Lit-Default" Pass { - Tags { "LightMode" = "UniversalForward" "Queue"="Transparent" "RenderType"="Transparent"} + Name "DepthOnly" + Tags {"LightMode" = "DepthOnly"} + Tags {"Queue" = "Geometry" "RenderType" = "Opaque"} + + ZWrite On + Cull Off + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + + //-------------------------------------- + // GPU Instancing + #pragma multi_compile_instancing + #pragma vertex DepthOnlyVertex + #pragma fragment DepthOnlyFragment + + struct Attributes + { + float4 position : POSITION; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct Varyings + { + float2 uv : TEXCOORD0; + float4 positionCS : SV_POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + float4 _MainTex_ST; + + Varyings DepthOnlyVertex(Attributes input) + { + Varyings output = (Varyings)0; + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + output.uv = TRANSFORM_TEX(input.texcoord, _MainTex); + output.positionCS = TransformObjectToHClip(input.position.xyz); + return output; + } + + half4 DepthOnlyFragment(Varyings i) : SV_TARGET + { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + half4 main = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv); + clip(main.a - half(1.0)); + return 0; + } + + ENDHLSL + } + + Pass + { + Tags { "LightMode" = "UniversalForward"} + Tags {"Queue" = "Transparent" "RenderType" = "Transparent"} + ZWrite Off HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"