Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

DepthBlitDepthOnlyPass.cs 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.RenderGraphModule;
  4. using UnityEngine.Rendering.Universal;
  5. // This pass is a simplified version of the URP DepthOnlyPass. This pass renders depth to an RTHandle.
  6. // Unlike the original URP DepthOnlyPass, this example does not use the _CameraDepthTexture texture, and demonstrates how to copy from the depth buffer to a custom RTHandle instead.
  7. public class DepthBlitDepthOnlyPass : ScriptableRenderPass
  8. {
  9. private const string k_PassName = "DepthBlitDepthOnlyPass";
  10. private ProfilingSampler m_ProfilingSampler = new ProfilingSampler(k_PassName);
  11. private RTHandle m_DestRT; // The RTHandle for storing the depth texture, set by the Renderer Feature
  12. FilteringSettings m_FilteringSettings;
  13. private static readonly ShaderTagId k_ShaderTagId = new ShaderTagId("DepthOnly");
  14. class PassData
  15. {
  16. public RendererListHandle rendererList;
  17. }
  18. public DepthBlitDepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, RTHandle destination)
  19. {
  20. renderPassEvent = evt;
  21. m_DestRT = destination;
  22. m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
  23. }
  24. #pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member
  25. // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path)
  26. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
  27. {
  28. ConfigureTarget(m_DestRT);
  29. }
  30. // Unity calls the Execute method in the Compatibility mode
  31. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  32. {
  33. var cameraData = renderingData.cameraData;
  34. if (cameraData.camera.cameraType != CameraType.Game)
  35. return;
  36. // Setup the RendererList for drawing objects with the shader tag "DepthOnly".
  37. var sortFlags = cameraData.defaultOpaqueSortFlags;
  38. var drawSettings = RenderingUtils.CreateDrawingSettings(k_ShaderTagId, ref renderingData, sortFlags);
  39. drawSettings.perObjectData = PerObjectData.None;
  40. RendererListParams param = new RendererListParams(renderingData.cullResults, drawSettings, m_FilteringSettings);
  41. param.filteringSettings.batchLayerMask = uint.MaxValue;
  42. RendererList rendererList = context.CreateRendererList(ref param);
  43. CommandBuffer cmd = CommandBufferPool.Get();
  44. using (new ProfilingScope(cmd, m_ProfilingSampler))
  45. {
  46. cmd.ClearRenderTarget(true,false, Color.black);
  47. cmd.DrawRendererList(rendererList);
  48. }
  49. context.ExecuteCommandBuffer(cmd);
  50. cmd.Clear();
  51. CommandBufferPool.Release(cmd);
  52. }
  53. #pragma warning restore 618, 672
  54. // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system.
  55. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
  56. {
  57. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  58. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  59. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  60. DepthBlitFeature.TexRefData texRefData = frameData.GetOrCreate<DepthBlitFeature.TexRefData>();
  61. // Set the texture resources for this render graph instance.
  62. TextureHandle dest = renderGraph.ImportTexture(m_DestRT);
  63. texRefData.depthTextureHandle = dest;
  64. if(!dest.IsValid())
  65. return;
  66. using (var builder = renderGraph.AddRasterRenderPass<PassData>(k_PassName, out var passData, m_ProfilingSampler))
  67. {
  68. // Setup the RendererList for drawing objects with the shader tag "DepthOnly".
  69. var sortFlags = cameraData.defaultOpaqueSortFlags;
  70. var drawSettings = RenderingUtils.CreateDrawingSettings(k_ShaderTagId, renderingData, cameraData, lightData, sortFlags);
  71. drawSettings.perObjectData = PerObjectData.None;
  72. RendererListParams param = new RendererListParams(renderingData.cullResults, drawSettings, m_FilteringSettings);
  73. param.filteringSettings.batchLayerMask = uint.MaxValue;
  74. passData.rendererList = renderGraph.CreateRendererList(param);
  75. builder.UseRendererList(passData.rendererList);
  76. builder.SetRenderAttachmentDepth(dest, AccessFlags.Write);
  77. builder.AllowPassCulling(false);
  78. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  79. {
  80. context.cmd.ClearRenderTarget(true,false, Color.black);
  81. context.cmd.DrawRendererList(data.rendererList);
  82. });
  83. }
  84. }
  85. }