Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DepthOnlyPass.cs 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using System;
  2. using UnityEngine.Experimental.Rendering;
  3. using UnityEngine.Rendering.RenderGraphModule;
  4. namespace UnityEngine.Rendering.Universal.Internal
  5. {
  6. /// <summary>
  7. /// Render all objects that have a 'DepthOnly' pass into the given depth buffer.
  8. ///
  9. /// You can use this pass to prime a depth buffer for subsequent rendering.
  10. /// Use it as a z-prepass, or use it to generate a depth buffer.
  11. /// </summary>
  12. public class DepthOnlyPass : ScriptableRenderPass
  13. {
  14. private static readonly ShaderTagId k_ShaderTagId = new ShaderTagId("DepthOnly");
  15. private RTHandle destination { get; set; }
  16. private GraphicsFormat depthStencilFormat;
  17. internal ShaderTagId shaderTagId { get; set; } = k_ShaderTagId;
  18. private PassData m_PassData;
  19. FilteringSettings m_FilteringSettings;
  20. /// <summary>
  21. /// Creates a new <c>DepthOnlyPass</c> instance.
  22. /// </summary>
  23. /// <param name="evt">The <c>RenderPassEvent</c> to use.</param>
  24. /// <param name="renderQueueRange">The <c>RenderQueueRange</c> to use for creating filtering settings that control what objects get rendered.</param>
  25. /// <param name="layerMask">The layer mask to use for creating filtering settings that control what objects get rendered.</param>
  26. /// <seealso cref="RenderPassEvent"/>
  27. /// <seealso cref="RenderQueueRange"/>
  28. /// <seealso cref="LayerMask"/>
  29. public DepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask)
  30. {
  31. base.profilingSampler = new ProfilingSampler(nameof(DepthOnlyPass));
  32. m_PassData = new PassData();
  33. m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
  34. renderPassEvent = evt;
  35. useNativeRenderPass = false;
  36. this.shaderTagId = k_ShaderTagId;
  37. }
  38. /// <summary>
  39. /// Configures the pass.
  40. /// </summary>
  41. /// <param name="baseDescriptor">The <c>RenderTextureDescriptor</c> used for the depthStencilFormat.</param>
  42. /// <param name="depthAttachmentHandle">The <c>RTHandle</c> used to render to.</param>
  43. /// <seealso cref="RenderTextureDescriptor"/>
  44. /// <seealso cref="RTHandle"/>
  45. /// <seealso cref="GraphicsFormat"/>
  46. public void Setup(
  47. RenderTextureDescriptor baseDescriptor,
  48. RTHandle depthAttachmentHandle)
  49. {
  50. this.destination = depthAttachmentHandle;
  51. this.depthStencilFormat = baseDescriptor.depthStencilFormat;
  52. }
  53. /// <inheritdoc />
  54. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  55. public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
  56. {
  57. var desc = renderingData.cameraData.cameraTargetDescriptor;
  58. // Disable obsolete warning for internal usage
  59. #pragma warning disable CS0618
  60. // When depth priming is in use the camera target should not be overridden so the Camera's MSAA depth attachment is used.
  61. if (renderingData.cameraData.renderer.useDepthPriming && (renderingData.cameraData.renderType == CameraRenderType.Base || renderingData.cameraData.clearDepth))
  62. {
  63. ConfigureTarget(renderingData.cameraData.renderer.cameraDepthTargetHandle);
  64. // Only clear depth here so we don't clear any bound color target. It might be unused by this pass but that doesn't mean we can just clear it. (e.g. in case of overlay cameras + depth priming)
  65. ConfigureClear(ClearFlag.Depth, Color.black);
  66. }
  67. // When not using depth priming the camera target should be set to our non MSAA depth target.
  68. else
  69. {
  70. useNativeRenderPass = true;
  71. ConfigureTarget(destination);
  72. ConfigureClear(ClearFlag.All, Color.black);
  73. }
  74. #pragma warning restore CS0618
  75. }
  76. private static void ExecutePass(RasterCommandBuffer cmd, RendererList rendererList)
  77. {
  78. using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.DepthPrepass)))
  79. {
  80. cmd.DrawRendererList(rendererList);
  81. }
  82. }
  83. /// <inheritdoc/>
  84. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  85. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  86. {
  87. ContextContainer frameData = renderingData.frameData;
  88. UniversalRenderingData universalRenderingData = frameData.Get<UniversalRenderingData>();
  89. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  90. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  91. var param = InitRendererListParams(universalRenderingData, cameraData, lightData);
  92. RendererList rendererList = context.CreateRendererList(ref param);
  93. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), rendererList);
  94. }
  95. private class PassData
  96. {
  97. internal RendererListHandle rendererList;
  98. }
  99. private RendererListParams InitRendererListParams(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData)
  100. {
  101. var sortFlags = cameraData.defaultOpaqueSortFlags;
  102. var drawSettings = RenderingUtils.CreateDrawingSettings(this.shaderTagId, renderingData, cameraData, lightData, sortFlags);
  103. drawSettings.perObjectData = PerObjectData.None;
  104. return new RendererListParams(renderingData.cullResults, drawSettings, m_FilteringSettings);
  105. }
  106. internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref TextureHandle cameraDepthTexture, uint batchLayerMask = uint.MaxValue)
  107. {
  108. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  109. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  110. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  111. using (var builder = renderGraph.AddRasterRenderPass<PassData>("DepthOnly Prepass", out var passData, base.profilingSampler))
  112. {
  113. var param = InitRendererListParams(renderingData, cameraData, lightData);
  114. param.filteringSettings.batchLayerMask = batchLayerMask;
  115. passData.rendererList = renderGraph.CreateRendererList(param);
  116. builder.UseRendererList(passData.rendererList);
  117. builder.SetRenderAttachmentDepth(cameraDepthTexture, AccessFlags.Write);
  118. // TODO RENDERGRAPH: culling? force culling off for testing
  119. builder.AllowPassCulling(false);
  120. builder.AllowGlobalStateModification(true);
  121. if (cameraData.xr.enabled)
  122. builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses);
  123. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  124. {
  125. ExecutePass(context.cmd, data.rendererList);
  126. });
  127. }
  128. }
  129. }
  130. }