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

DecalGBufferRenderPass.cs 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 DecalDrawGBufferSystem : DecalDrawSystem
  9. {
  10. public DecalDrawGBufferSystem(DecalEntityManager entityManager) : base("DecalDrawGBufferSystem.Execute", entityManager) { }
  11. protected override int GetPassIndex(DecalCachedChunk decalCachedChunk) => decalCachedChunk.passIndexGBuffer;
  12. }
  13. internal class DecalGBufferRenderPass : ScriptableRenderPass
  14. {
  15. private FilteringSettings m_FilteringSettings;
  16. private List<ShaderTagId> m_ShaderTagIdList;
  17. private DecalDrawGBufferSystem m_DrawSystem;
  18. private DecalScreenSpaceSettings m_Settings;
  19. private DeferredLights m_DeferredLights;
  20. private RTHandle[] m_GbufferAttachments;
  21. private bool m_DecalLayers;
  22. private PassData m_PassData;
  23. public DecalGBufferRenderPass(DecalScreenSpaceSettings settings, DecalDrawGBufferSystem drawSystem, bool decalLayers)
  24. {
  25. renderPassEvent = RenderPassEvent.AfterRenderingGbuffer;
  26. m_DrawSystem = drawSystem;
  27. m_Settings = settings;
  28. profilingSampler = new ProfilingSampler("Draw Decal To GBuffer");
  29. m_FilteringSettings = new FilteringSettings(RenderQueueRange.opaque, -1);
  30. m_DecalLayers = decalLayers;
  31. m_ShaderTagIdList = new List<ShaderTagId>();
  32. if (drawSystem == null)
  33. m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalGBufferProjector));
  34. else
  35. m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalGBufferMesh));
  36. m_PassData = new PassData();
  37. m_GbufferAttachments = new RTHandle[4];
  38. breakGBufferAndDeferredRenderPass = false;
  39. }
  40. internal void Setup(DeferredLights deferredLights)
  41. {
  42. m_DeferredLights = deferredLights;
  43. }
  44. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  45. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
  46. {
  47. if (m_DeferredLights.UseFramebufferFetch)
  48. {
  49. m_GbufferAttachments[0] = m_DeferredLights.GbufferAttachments[0];
  50. m_GbufferAttachments[1] = m_DeferredLights.GbufferAttachments[1];
  51. m_GbufferAttachments[2] = m_DeferredLights.GbufferAttachments[2];
  52. m_GbufferAttachments[3] = m_DeferredLights.GbufferAttachments[3];
  53. if (m_DecalLayers)
  54. {
  55. var deferredInputAttachments = new RTHandle[]
  56. {
  57. m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex],
  58. m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferRenderingLayers],
  59. };
  60. var deferredInputIsTransient = new bool[]
  61. {
  62. true, false, // TODO: Make rendering layers transient
  63. };
  64. // Disable obsolete warning for internal usage
  65. #pragma warning disable CS0618
  66. ConfigureInputAttachments(deferredInputAttachments, deferredInputIsTransient);
  67. #pragma warning restore CS0618
  68. }
  69. else
  70. {
  71. var deferredInputAttachments = new RTHandle[]
  72. {
  73. m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex],
  74. };
  75. var deferredInputIsTransient = new bool[]
  76. {
  77. true,
  78. };
  79. // Disable obsolete warning for internal usage
  80. #pragma warning disable CS0618
  81. ConfigureInputAttachments(deferredInputAttachments, deferredInputIsTransient);
  82. #pragma warning restore CS0618
  83. }
  84. }
  85. else
  86. {
  87. m_GbufferAttachments[0] = m_DeferredLights.GbufferAttachments[0];
  88. m_GbufferAttachments[1] = m_DeferredLights.GbufferAttachments[1];
  89. m_GbufferAttachments[2] = m_DeferredLights.GbufferAttachments[2];
  90. m_GbufferAttachments[3] = m_DeferredLights.GbufferAttachments[3];
  91. }
  92. // Disable obsolete warning for internal usage
  93. #pragma warning disable CS0618
  94. ConfigureTarget(m_GbufferAttachments, m_DeferredLights.DepthAttachmentHandle);
  95. #pragma warning restore CS0618
  96. }
  97. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  98. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  99. {
  100. UniversalCameraData cameraData = renderingData.frameData.Get<UniversalCameraData>();
  101. InitPassData(cameraData, ref m_PassData);
  102. SortingCriteria sortingCriteria = renderingData.cameraData.defaultOpaqueSortFlags;
  103. DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria);
  104. var param = new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings);
  105. var rendererList = context.CreateRendererList(ref param);
  106. using (new ProfilingScope(renderingData.commandBuffer, profilingSampler))
  107. {
  108. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList);
  109. }
  110. }
  111. private class PassData
  112. {
  113. internal DecalDrawGBufferSystem drawSystem;
  114. internal DecalScreenSpaceSettings settings;
  115. internal bool decalLayers;
  116. internal UniversalCameraData cameraData;
  117. internal RendererListHandle rendererList;
  118. }
  119. private void InitPassData(UniversalCameraData cameraData, ref PassData passData)
  120. {
  121. passData.drawSystem = m_DrawSystem;
  122. passData.settings = m_Settings;
  123. passData.decalLayers = m_DecalLayers;
  124. passData.cameraData = cameraData;
  125. }
  126. private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList)
  127. {
  128. NormalReconstruction.SetupProperties(cmd, passData.cameraData);
  129. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendLow, passData.settings.normalBlend == DecalNormalBlend.Low);
  130. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendMedium, passData.settings.normalBlend == DecalNormalBlend.Medium);
  131. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendHigh, passData.settings.normalBlend == DecalNormalBlend.High);
  132. cmd.SetKeyword(ShaderGlobalKeywords.DecalLayers, passData.decalLayers);
  133. passData.drawSystem?.Execute(cmd);
  134. cmd.DrawRendererList(rendererList);
  135. }
  136. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
  137. {
  138. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  139. TextureHandle cameraDepthTexture = resourceData.cameraDepthTexture;
  140. using (var builder = renderGraph.AddRasterRenderPass<PassData>(profilingSampler.name, out var passData, profilingSampler))
  141. {
  142. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  143. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  144. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  145. InitPassData(cameraData, ref passData);
  146. TextureHandle[] gBufferHandles = resourceData.gBuffer;
  147. builder.SetRenderAttachment(gBufferHandles[0], 0, AccessFlags.Write);
  148. builder.SetRenderAttachment(gBufferHandles[1], 1, AccessFlags.Write);
  149. builder.SetRenderAttachment(gBufferHandles[2], 2, AccessFlags.Write);
  150. builder.SetRenderAttachment(gBufferHandles[3], 3, AccessFlags.Write);
  151. builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Read);
  152. if (renderGraph.nativeRenderPassesEnabled)
  153. {
  154. builder.SetInputAttachment(gBufferHandles[4], 0, AccessFlags.Read);
  155. if (m_DecalLayers)
  156. builder.SetInputAttachment(gBufferHandles[5], 1, AccessFlags.Read);
  157. }
  158. else if (cameraDepthTexture.IsValid())
  159. builder.UseTexture(cameraDepthTexture, AccessFlags.Read);
  160. SortingCriteria sortingCriteria = passData.cameraData.defaultOpaqueSortFlags;
  161. DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, renderingData,
  162. passData.cameraData, lightData, sortingCriteria);
  163. var param = new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings);
  164. passData.rendererList = renderGraph.CreateRendererList(param);
  165. builder.UseRendererList(passData.rendererList);
  166. builder.AllowGlobalStateModification(true);
  167. builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) =>
  168. {
  169. ExecutePass(rgContext.cmd, data, data.rendererList);
  170. });
  171. }
  172. }
  173. public override void OnCameraCleanup(CommandBuffer cmd)
  174. {
  175. if (cmd == null)
  176. {
  177. throw new System.ArgumentNullException("cmd");
  178. }
  179. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendLow, false);
  180. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendMedium, false);
  181. cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendHigh, false);
  182. cmd.SetKeyword(ShaderGlobalKeywords.DecalLayers, false);
  183. }
  184. }
  185. }