您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
92 行
3.4 KiB
92 行
3.4 KiB
using System;
|
|
|
|
namespace UnityEngine.Rendering.Universal.Internal
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
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");
|
|
|
|
/// <summary>
|
|
/// Create the DepthOnlyPass
|
|
/// </summary>
|
|
public DepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask)
|
|
{
|
|
m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
|
|
renderPassEvent = evt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configure the pass
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
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);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public override void FrameCleanup(CommandBuffer cmd)
|
|
{
|
|
if (cmd == null)
|
|
throw new ArgumentNullException("cmd");
|
|
|
|
if (depthAttachmentHandle != RenderTargetHandle.CameraTarget)
|
|
{
|
|
cmd.ReleaseTemporaryRT(depthAttachmentHandle.id);
|
|
depthAttachmentHandle = RenderTargetHandle.CameraTarget;
|
|
}
|
|
}
|
|
}
|
|
}
|