using System; using UnityEngine.Rendering.RenderGraphModule; using UnityEngine.Rendering.Universal.U2D.Profiler; using CommonResourceData = UnityEngine.Rendering.Universal.UniversalResourceData; namespace UnityEngine.Rendering.Universal { internal class DrawNormal2DPass : ScriptableRenderPass { private static readonly ShaderTagId k_NormalsRenderingPassName = new ShaderTagId("NormalsRendering"); private class PassData { internal RendererListHandle rendererList; } private static void Execute(RasterCommandBuffer cmd, PassData passData) { cmd.DrawRendererList(passData.rendererList); } public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex) { Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); Renderer2DData rendererData = frameData.Get().renderingData; var layerBatch = frameData.Get().layerBatches[batchIndex]; if (!layerBatch.useNormals) return; UniversalRenderingData renderingData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); UniversalLightData lightData = frameData.Get(); var passName = ProfilerMarkers.s_MormalPass; LayerDebug.FormatPassName(layerBatch, ref passName); using (var builder = graph.AddRasterRenderPass(passName, out var passData, LayerDebug.GetProfilingSampler(passName, ProfilerMarkers.s_ProfilingSamplerNormalPass))) { LayerUtility.GetFilterSettings(rendererData, layerBatch, out var filterSettings); var drawSettings = CreateDrawingSettings(k_NormalsRenderingPassName, renderingData, cameraData, lightData, SortingCriteria.CommonTransparent); var sortSettings = drawSettings.sortingSettings; RendererLighting.GetTransparencySortingMode(rendererData, cameraData.camera, ref sortSettings); drawSettings.sortingSettings = sortSettings; builder.AllowPassCulling(false); builder.SetRenderAttachment(universal2DResourceData.normalsTexture[batchIndex], 0); // Depth needed for sprite mask stencil or z test for 3d meshes if (commonResourceData.activeDepthTexture.IsValid()) { var depth = universal2DResourceData.normalsDepth.IsValid() ? universal2DResourceData.normalsDepth : commonResourceData.activeDepthTexture; builder.SetRenderAttachmentDepth(depth); } var param = new RendererListParams(renderingData.cullResults, drawSettings, filterSettings); passData.rendererList = graph.CreateRendererList(param); builder.UseRendererList(passData.rendererList); builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => { Execute(context.cmd, data); }); } } } }