using System; using UnityEngine.Rendering.RenderGraphModule; // cleanup code // listMinDepth and maxDepth should be stored in a different uniform block? // Point lights stored as vec4 // RelLightIndices should be stored in ushort instead of uint. // TODO use Unity.Mathematics // TODO Check if there is a bitarray structure (with dynamic size) available in Unity namespace UnityEngine.Rendering.Universal.Internal { // Render all tiled-based deferred lights. internal class DeferredPass : ScriptableRenderPass { DeferredLights m_DeferredLights; public DeferredPass(RenderPassEvent evt, DeferredLights deferredLights) { profilingSampler = new ProfilingSampler("Render Deferred Lighting"); base.renderPassEvent = evt; m_DeferredLights = deferredLights; } private class PassData { internal UniversalCameraData cameraData; internal UniversalLightData lightData; internal UniversalShadowData shadowData; internal TextureHandle[] gbuffer; internal DeferredLights deferredLights; } public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { var cameraData = frameData.Get(); var resourceData = frameData.Get(); var lightData = frameData.Get(); var shadowData = frameData.Get(); var color = resourceData.activeColorTexture; var depth = resourceData.activeDepthTexture; var gbuffer = resourceData.gBuffer; using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { passData.cameraData = cameraData; passData.lightData = lightData; passData.shadowData = shadowData; builder.SetRenderAttachment(color, 0, AccessFlags.Write); builder.SetRenderAttachmentDepth(depth, AccessFlags.ReadWrite); passData.deferredLights = m_DeferredLights; for (int i = 0, idx = 0; i < gbuffer.Length; ++i) { if (i == m_DeferredLights.GBufferLightingIndex) continue; builder.SetInputAttachment(gbuffer[i], idx++); } builder.AllowGlobalStateModification(true); builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => { data.deferredLights.ExecuteDeferredPass(context.cmd, data.cameraData, data.lightData, data.shadowData, data.gbuffer); }); } } // ScriptableRenderPass public override void OnCameraCleanup(CommandBuffer cmd) { m_DeferredLights.OnCameraCleanup(cmd); } } }