暫無描述
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.

DecalScreenSpaceRenderPass.cs 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.Experimental.Rendering;
  4. using UnityEngine.Rendering.RenderGraphModule;
  5. using UnityEngine.Rendering.Universal.Internal;
  6. namespace UnityEngine.Rendering.Universal
  7. {
  8. internal class DecalDrawScreenSpaceSystem : DecalDrawSystem
  9. {
  10. public DecalDrawScreenSpaceSystem(DecalEntityManager entityManager) : base("DecalDrawScreenSpaceSystem.Execute", entityManager) { }
  11. protected override int GetPassIndex(DecalCachedChunk decalCachedChunk) => decalCachedChunk.passIndexScreenSpace;
  12. }
  13. internal class DecalScreenSpaceRenderPass : ScriptableRenderPass
  14. {
  15. private FilteringSettings m_FilteringSettings;
  16. private List<ShaderTagId> m_ShaderTagIdList;
  17. private DecalDrawScreenSpaceSystem m_DrawSystem;
  18. private DecalScreenSpaceSettings m_Settings;
  19. private bool m_DecalLayers;
  20. private PassData m_PassData;
  21. public DecalScreenSpaceRenderPass(DecalScreenSpaceSettings settings, DecalDrawScreenSpaceSystem drawSystem, bool decalLayers)
  22. {
  23. renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
  24. var scriptableRenderPassInput = ScriptableRenderPassInput.Depth; // Require depth
  25. ConfigureInput(scriptableRenderPassInput);
  26. m_DrawSystem = drawSystem;
  27. m_Settings = settings;
  28. profilingSampler = new ProfilingSampler("Draw Decal Screen Space");
  29. m_FilteringSettings = new FilteringSettings(RenderQueueRange.opaque, -1);
  30. m_DecalLayers = decalLayers;
  31. m_ShaderTagIdList = new List<ShaderTagId>();
  32. if (m_DrawSystem == null)
  33. m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceProjector));
  34. else
  35. m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceMesh));
  36. m_PassData = new PassData();
  37. }
  38. private RendererListParams CreateRenderListParams(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData)
  39. {
  40. SortingCriteria sortingCriteria = SortingCriteria.None;
  41. DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, renderingData, cameraData, lightData, sortingCriteria);
  42. return new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings);
  43. }
  44. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  45. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  46. {
  47. UniversalCameraData cameraData = renderingData.frameData.Get<UniversalCameraData>();
  48. InitPassData(cameraData, ref m_PassData);
  49. RenderingUtils.SetScaleBiasRt(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), in renderingData);
  50. UniversalRenderingData universalRenderingData = renderingData.frameData.Get<UniversalRenderingData>();
  51. UniversalLightData lightData = renderingData.frameData.Get<UniversalLightData>();
  52. var param = CreateRenderListParams(universalRenderingData, cameraData, lightData);
  53. var rendererList = context.CreateRendererList(ref param);
  54. using (new ProfilingScope(renderingData.commandBuffer, profilingSampler))
  55. {
  56. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList);
  57. }
  58. }
  59. private class PassData
  60. {
  61. internal DecalDrawScreenSpaceSystem drawSystem;
  62. internal DecalScreenSpaceSettings settings;
  63. internal bool decalLayers;
  64. internal bool isGLDevice;
  65. internal TextureHandle colorTarget;
  66. internal UniversalCameraData cameraData;
  67. internal RendererListHandle rendererList;
  68. }
  69. private void InitPassData(UniversalCameraData cameraData, ref PassData passData)
  70. {
  71. passData.drawSystem = m_DrawSystem;
  72. passData.settings = m_Settings;
  73. passData.decalLayers = m_DecalLayers;
  74. passData.isGLDevice = DecalRendererFeature.isGLDevice;
  75. passData.cameraData = cameraData;
  76. }
  77. private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList)
  78. {
  79. NormalReconstruction.SetupProperties(cmd, passData.cameraData);
  80. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendLow, passData.settings.normalBlend == DecalNormalBlend.Low);
  81. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendMedium, passData.settings.normalBlend == DecalNormalBlend.Medium);
  82. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendHigh, passData.settings.normalBlend == DecalNormalBlend.High);
  83. if (!passData.isGLDevice)
  84. cmd.SetKeyword(ShaderGlobalKeywords.DecalLayers, passData.decalLayers);
  85. passData.drawSystem?.Execute(cmd);
  86. cmd.DrawRendererList(rendererList);
  87. }
  88. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
  89. {
  90. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  91. TextureHandle cameraDepthTexture = resourceData.cameraDepthTexture;
  92. using (var builder = renderGraph.AddRasterRenderPass<PassData>(profilingSampler.name, out var passData, profilingSampler))
  93. {
  94. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  95. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  96. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  97. InitPassData(cameraData, ref passData);
  98. passData.colorTarget = resourceData.cameraColor;
  99. builder.SetRenderAttachment(resourceData.activeColorTexture, 0, AccessFlags.Write);
  100. builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Read);
  101. var param = CreateRenderListParams(renderingData, passData.cameraData, lightData);
  102. passData.rendererList = renderGraph.CreateRendererList(param);
  103. builder.UseRendererList(passData.rendererList);
  104. if (cameraDepthTexture.IsValid())
  105. builder.UseTexture(cameraDepthTexture, AccessFlags.Read);
  106. builder.AllowGlobalStateModification(true);
  107. builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) =>
  108. {
  109. RenderingUtils.SetScaleBiasRt(rgContext.cmd, in data.cameraData, data.colorTarget);
  110. ExecutePass(rgContext.cmd, data, data.rendererList);
  111. });
  112. }
  113. }
  114. public override void OnCameraCleanup(CommandBuffer cmd)
  115. {
  116. if (cmd == null)
  117. {
  118. throw new System.ArgumentNullException("cmd");
  119. }
  120. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendLow, false);
  121. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendMedium, false);
  122. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendHigh, false);
  123. cmd.SetKeyword(ShaderGlobalKeywords.DecalLayers, false);
  124. }
  125. }
  126. }