Files
2026-11-01 23:39:55 +02:00

71 lines
3.2 KiB
C#

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<Universal2DResourceData>();
CommonResourceData commonResourceData = frameData.Get<CommonResourceData>();
Renderer2DData rendererData = frameData.Get<Universal2DRenderingData>().renderingData;
var layerBatch = frameData.Get<Universal2DRenderingData>().layerBatches[batchIndex];
if (!layerBatch.useNormals)
return;
UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
UniversalLightData lightData = frameData.Get<UniversalLightData>();
var passName = ProfilerMarkers.s_MormalPass;
LayerDebug.FormatPassName(layerBatch, ref passName);
using (var builder = graph.AddRasterRenderPass<PassData>(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);
});
}
}
}
}