123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- using System;
- using UnityEngine.Experimental.GlobalIllumination;
- using UnityEngine.Profiling;
- using Unity.Collections;
- using UnityEngine.Rendering.RenderGraphModule;
- using UnityEngine.Experimental.Rendering;
-
- // 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)
- {
- base.profilingSampler = new ProfilingSampler("Render Deferred Lighting");
- base.renderPassEvent = evt;
- m_DeferredLights = deferredLights;
- }
-
- // ScriptableRenderPass
- [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
- public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor)
- {
- var lightingAttachment = m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferLightingIndex];
- var depthAttachment = m_DeferredLights.DepthAttachmentHandle;
-
- if (m_DeferredLights.UseFramebufferFetch)
- {
- // Disable obsolete warning for internal usage
- #pragma warning disable CS0618
- ConfigureInputAttachments(m_DeferredLights.DeferredInputAttachments, m_DeferredLights.DeferredInputIsTransient);
- #pragma warning restore CS0618
- }
-
- // Disable obsolete warning for internal usage
- #pragma warning disable CS0618
- // TODO: Cannot currently bind depth texture as read-only!
- ConfigureTarget(lightingAttachment, depthAttachment);
- #pragma warning restore CS0618
- }
-
- // ScriptableRenderPass
- [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
- public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
- {
- ContextContainer frameData = renderingData.frameData;
- UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
- UniversalLightData lightData = frameData.Get<UniversalLightData>();
- UniversalShadowData shadowData = frameData.Get<UniversalShadowData>();
-
- m_DeferredLights.ExecuteDeferredPass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), cameraData, lightData, shadowData);
- }
-
- private class PassData
- {
- internal UniversalCameraData cameraData;
- internal UniversalLightData lightData;
- internal UniversalShadowData shadowData;
-
- internal TextureHandle color;
- internal TextureHandle depth;
- internal TextureHandle[] gbuffer;
- internal DeferredLights deferredLights;
- }
-
- internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle color, TextureHandle depth, TextureHandle[] gbuffer)
- {
- UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
- UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
- UniversalLightData lightData = frameData.Get<UniversalLightData>();
- UniversalShadowData shadowData = frameData.Get<UniversalShadowData>();
-
- using (var builder = renderGraph.AddRasterRenderPass<PassData>(base.profilingSampler.name, out var passData, base.profilingSampler))
- {
- passData.cameraData = cameraData;
- passData.lightData = lightData;
- passData.shadowData = shadowData;
-
- passData.color = color;
- builder.SetRenderAttachment(color, 0, AccessFlags.Write);
- passData.depth = depth;
- builder.SetRenderAttachmentDepth(depth, AccessFlags.Write);
- passData.deferredLights = m_DeferredLights;
-
- if (!m_DeferredLights.UseFramebufferFetch)
- {
- for (int i = 0; i < gbuffer.Length; ++i)
- {
- if (i != m_DeferredLights.GBufferLightingIndex)
- builder.UseTexture(gbuffer[i], AccessFlags.Read);
- }
- }
- else
- {
- var idx = 0;
- for (int i = 0; i < gbuffer.Length; ++i)
- {
- if (i != m_DeferredLights.GBufferLightingIndex)
- {
- builder.SetInputAttachment(gbuffer[i], idx, AccessFlags.Read);
- idx++;
- }
- }
- }
-
- builder.AllowPassCulling(false);
- builder.AllowGlobalStateModification(true);
-
- builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
- {
- data.deferredLights.ExecuteDeferredPass(context.cmd, data.cameraData, data.lightData, data.shadowData);
- });
- }
- }
-
- // ScriptableRenderPass
- public override void OnCameraCleanup(CommandBuffer cmd)
- {
- m_DeferredLights.OnCameraCleanup(cmd);
- }
- }
- }
|