using System; namespace UnityEngine.Rendering.Universal.Internal { /// /// Render all objects that have a 'DepthOnly' pass into the given depth buffer. /// /// You can use this pass to prime a depth buffer for subsequent rendering. /// Use it as a z-prepass, or use it to generate a depth buffer. /// public class DepthOnlyPass : ScriptableRenderPass { int kDepthBufferBits = 32; private RenderTargetHandle depthAttachmentHandle { get; set; } internal RenderTextureDescriptor descriptor { get; private set; } FilteringSettings m_FilteringSettings; string m_ProfilerTag = "Depth Prepass"; ShaderTagId m_ShaderTagId = new ShaderTagId("DepthOnly"); /// /// Create the DepthOnlyPass /// public DepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask) { m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); renderPassEvent = evt; } /// /// Configure the pass /// public void Setup( RenderTextureDescriptor baseDescriptor, RenderTargetHandle depthAttachmentHandle) { this.depthAttachmentHandle = depthAttachmentHandle; baseDescriptor.colorFormat = RenderTextureFormat.Depth; baseDescriptor.depthBufferBits = kDepthBufferBits; // Depth-Only pass don't use MSAA baseDescriptor.msaaSamples = 1; descriptor = baseDescriptor; } public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { cmd.GetTemporaryRT(depthAttachmentHandle.id, descriptor, FilterMode.Point); ConfigureTarget(depthAttachmentHandle.Identifier()); ConfigureClear(ClearFlag.All, Color.black); } /// public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag); using (new ProfilingSample(cmd, m_ProfilerTag)) { context.ExecuteCommandBuffer(cmd); cmd.Clear(); var sortFlags = renderingData.cameraData.defaultOpaqueSortFlags; var drawSettings = CreateDrawingSettings(m_ShaderTagId, ref renderingData, sortFlags); drawSettings.perObjectData = PerObjectData.None; ref CameraData cameraData = ref renderingData.cameraData; Camera camera = cameraData.camera; if (cameraData.isStereoEnabled) context.StartMultiEye(camera); context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref m_FilteringSettings); } context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } /// public override void FrameCleanup(CommandBuffer cmd) { if (cmd == null) throw new ArgumentNullException("cmd"); if (depthAttachmentHandle != RenderTargetHandle.CameraTarget) { cmd.ReleaseTemporaryRT(depthAttachmentHandle.id); depthAttachmentHandle = RenderTargetHandle.CameraTarget; } } } }