Няма описание
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.

DrawObjectsPass.cs 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.Experimental.Rendering;
  4. using UnityEngine.Rendering.RenderGraphModule;
  5. using UnityEngine.Profiling;
  6. namespace UnityEngine.Rendering.Universal.Internal
  7. {
  8. /// <summary>
  9. /// Draw objects into the given color and depth target
  10. ///
  11. /// You can use this pass to render objects that have a material and/or shader
  12. /// with the pass names UniversalForward or SRPDefaultUnlit.
  13. /// </summary>
  14. public class DrawObjectsPass : ScriptableRenderPass
  15. {
  16. FilteringSettings m_FilteringSettings;
  17. RenderStateBlock m_RenderStateBlock;
  18. List<ShaderTagId> m_ShaderTagIdList = new List<ShaderTagId>();
  19. bool m_IsOpaque;
  20. /// <summary>
  21. /// Used to indicate if the active target of the pass is the back buffer
  22. /// </summary>
  23. public bool m_IsActiveTargetBackBuffer; // TODO: Remove this when we remove non-RG path
  24. /// <summary>
  25. /// Used to indicate whether transparent objects should receive shadows or not.
  26. /// </summary>
  27. public bool m_ShouldTransparentsReceiveShadows;
  28. PassData m_PassData;
  29. static readonly int s_DrawObjectPassDataPropID = Shader.PropertyToID("_DrawObjectPassData");
  30. /// <summary>
  31. /// Creates a new <c>DrawObjectsPass</c> instance.
  32. /// </summary>
  33. /// <param name="profilerTag">The profiler tag used with the pass.</param>
  34. /// <param name="shaderTagIds"></param>
  35. /// <param name="opaque">Marks whether the objects are opaque or transparent.</param>
  36. /// <param name="evt">The <c>RenderPassEvent</c> to use.</param>
  37. /// <param name="renderQueueRange">The <c>RenderQueueRange</c> to use for creating filtering settings that control what objects get rendered.</param>
  38. /// <param name="layerMask">The layer mask to use for creating filtering settings that control what objects get rendered.</param>
  39. /// <param name="stencilState">The stencil settings to use with this poss.</param>
  40. /// <param name="stencilReference">The stencil reference value to use with this pass.</param>
  41. /// <seealso cref="ShaderTagId"/>
  42. /// <seealso cref="RenderPassEvent"/>
  43. /// <seealso cref="RenderQueueRange"/>
  44. /// <seealso cref="LayerMask"/>
  45. /// <seealso cref="StencilState"/>
  46. public DrawObjectsPass(string profilerTag, ShaderTagId[] shaderTagIds, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference)
  47. {
  48. base.profilingSampler = new ProfilingSampler(profilerTag);
  49. m_PassData = new PassData();
  50. foreach (ShaderTagId sid in shaderTagIds)
  51. m_ShaderTagIdList.Add(sid);
  52. renderPassEvent = evt;
  53. m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
  54. m_RenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
  55. m_IsOpaque = opaque;
  56. m_ShouldTransparentsReceiveShadows = false;
  57. m_IsActiveTargetBackBuffer = false;
  58. if (stencilState.enabled)
  59. {
  60. m_RenderStateBlock.stencilReference = stencilReference;
  61. m_RenderStateBlock.mask = RenderStateMask.Stencil;
  62. m_RenderStateBlock.stencilState = stencilState;
  63. }
  64. }
  65. /// <summary>
  66. /// Creates a new <c>DrawObjectsPass</c> instance.
  67. /// </summary>
  68. /// <param name="profilerTag">The profiler tag used with the pass.</param>
  69. /// <param name="opaque">Marks whether the objects are opaque or transparent.</param>
  70. /// <param name="evt">The <c>RenderPassEvent</c> to use.</param>
  71. /// <param name="renderQueueRange">The <c>RenderQueueRange</c> to use for creating filtering settings that control what objects get rendered.</param>
  72. /// <param name="layerMask">The layer mask to use for creating filtering settings that control what objects get rendered.</param>
  73. /// <param name="stencilState">The stencil settings to use with this poss.</param>
  74. /// <param name="stencilReference">The stencil reference value to use with this pass.</param>
  75. /// <seealso cref="RenderPassEvent"/>
  76. /// <seealso cref="RenderQueueRange"/>
  77. /// <seealso cref="LayerMask"/>
  78. /// <seealso cref="StencilState"/>
  79. public DrawObjectsPass(string profilerTag, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference)
  80. : this(profilerTag,
  81. new ShaderTagId[] { new ShaderTagId("SRPDefaultUnlit"), new ShaderTagId("UniversalForward"), new ShaderTagId("UniversalForwardOnly") },
  82. opaque, evt, renderQueueRange, layerMask, stencilState, stencilReference)
  83. { }
  84. internal DrawObjectsPass(URPProfileId profileId, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference)
  85. : this("", opaque, evt, renderQueueRange, layerMask, stencilState, stencilReference)
  86. {
  87. profilingSampler = ProfilingSampler.Get(profileId);
  88. }
  89. /// <inheritdoc/>
  90. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  91. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  92. {
  93. ContextContainer frameData = renderingData.frameData;
  94. UniversalRenderingData universalRenderingData = frameData.Get<UniversalRenderingData>();
  95. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  96. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  97. InitPassData(cameraData, ref m_PassData, uint.MaxValue, m_IsActiveTargetBackBuffer);
  98. InitRendererLists(universalRenderingData, cameraData, lightData, ref m_PassData, context, default(RenderGraph), false);
  99. using (new ProfilingScope(renderingData.commandBuffer, profilingSampler))
  100. {
  101. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_PassData.rendererList, m_PassData.objectsWithErrorRendererList, m_PassData.cameraData.IsCameraProjectionMatrixFlipped());
  102. }
  103. }
  104. internal static void ExecutePass(RasterCommandBuffer cmd, PassData data, RendererList rendererList, RendererList objectsWithErrorRendererList, bool yFlip)
  105. {
  106. // Global render pass data containing various settings.
  107. // x,y,z are currently unused
  108. // w is used for knowing whether the object is opaque(1) or alpha blended(0)
  109. Vector4 drawObjectPassData = new Vector4(0.0f, 0.0f, 0.0f, (data.isOpaque) ? 1.0f : 0.0f);
  110. cmd.SetGlobalVector(s_DrawObjectPassDataPropID, drawObjectPassData);
  111. if (data.cameraData.xr.enabled && data.isActiveTargetBackBuffer)
  112. {
  113. cmd.SetViewport(data.cameraData.xr.GetViewport());
  114. }
  115. // scaleBias.x = flipSign
  116. // scaleBias.y = scale
  117. // scaleBias.z = bias
  118. // scaleBias.w = unused
  119. float flipSign = yFlip ? -1.0f : 1.0f;
  120. Vector4 scaleBias = (flipSign < 0.0f)
  121. ? new Vector4(flipSign, 1.0f, -1.0f, 1.0f)
  122. : new Vector4(flipSign, 0.0f, 1.0f, 1.0f);
  123. cmd.SetGlobalVector(ShaderPropertyId.scaleBiasRt, scaleBias);
  124. // Set a value that can be used by shaders to identify when AlphaToMask functionality may be active
  125. // The material shader alpha clipping logic requires this value in order to function correctly in all cases.
  126. float alphaToMaskAvailable = ((data.cameraData.cameraTargetDescriptor.msaaSamples > 1) && data.isOpaque) ? 1.0f : 0.0f;
  127. cmd.SetGlobalFloat(ShaderPropertyId.alphaToMaskAvailable, alphaToMaskAvailable);
  128. var activeDebugHandler = GetActiveDebugHandler(data.cameraData);
  129. if (activeDebugHandler != null)
  130. {
  131. data.debugRendererLists.DrawWithRendererList(cmd);
  132. }
  133. else
  134. {
  135. cmd.DrawRendererList(rendererList);
  136. // Render objects that did not match any shader pass with error shader
  137. RenderingUtils.DrawRendererListObjectsWithError(cmd, ref objectsWithErrorRendererList);
  138. }
  139. }
  140. /// <summary>
  141. /// Shared pass data
  142. /// </summary>
  143. internal class PassData
  144. {
  145. internal TextureHandle albedoHdl;
  146. internal TextureHandle depthHdl;
  147. internal UniversalCameraData cameraData;
  148. internal bool isOpaque;
  149. internal bool shouldTransparentsReceiveShadows;
  150. internal uint batchLayerMask;
  151. internal bool isActiveTargetBackBuffer;
  152. internal RendererListHandle rendererListHdl;
  153. internal RendererListHandle objectsWithErrorRendererListHdl;
  154. internal DebugRendererLists debugRendererLists;
  155. // Required for code sharing purpose between RG and non-RG.
  156. internal RendererList rendererList;
  157. internal RendererList objectsWithErrorRendererList;
  158. }
  159. /// <summary>
  160. /// Initialize the shared pass data.
  161. /// </summary>
  162. /// <param name="passData"></param>
  163. internal void InitPassData(UniversalCameraData cameraData, ref PassData passData, uint batchLayerMask, bool isActiveTargetBackBuffer = false)
  164. {
  165. passData.cameraData = cameraData;
  166. passData.isOpaque = m_IsOpaque;
  167. passData.shouldTransparentsReceiveShadows = m_ShouldTransparentsReceiveShadows;
  168. passData.batchLayerMask = batchLayerMask;
  169. passData.isActiveTargetBackBuffer = isActiveTargetBackBuffer;
  170. }
  171. internal void InitRendererLists(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, bool useRenderGraph)
  172. {
  173. ref Camera camera = ref cameraData.camera;
  174. var sortFlags = (m_IsOpaque) ? cameraData.defaultOpaqueSortFlags : SortingCriteria.CommonTransparent;
  175. if (cameraData.renderer.useDepthPriming && m_IsOpaque && (cameraData.renderType == CameraRenderType.Base || cameraData.clearDepth))
  176. sortFlags = SortingCriteria.SortingLayer | SortingCriteria.RenderQueue | SortingCriteria.OptimizeStateChanges | SortingCriteria.CanvasOrder;
  177. var filterSettings = m_FilteringSettings;
  178. filterSettings.batchLayerMask = passData.batchLayerMask;
  179. #if UNITY_EDITOR
  180. // When rendering the preview camera, we want the layer mask to be forced to Everything
  181. if (cameraData.isPreviewCamera)
  182. {
  183. filterSettings.layerMask = -1;
  184. }
  185. #endif
  186. DrawingSettings drawSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, renderingData, cameraData, lightData, sortFlags);
  187. if (cameraData.renderer.useDepthPriming && m_IsOpaque && (cameraData.renderType == CameraRenderType.Base || cameraData.clearDepth))
  188. {
  189. m_RenderStateBlock.depthState = new DepthState(false, CompareFunction.Equal);
  190. m_RenderStateBlock.mask |= RenderStateMask.Depth;
  191. }
  192. else if (m_RenderStateBlock.depthState.compareFunction == CompareFunction.Equal)
  193. {
  194. m_RenderStateBlock.depthState = new DepthState(true, CompareFunction.LessEqual);
  195. m_RenderStateBlock.mask |= RenderStateMask.Depth;
  196. }
  197. var activeDebugHandler = GetActiveDebugHandler(cameraData);
  198. if (useRenderGraph)
  199. {
  200. if (activeDebugHandler != null)
  201. {
  202. passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(renderGraph, ref renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock);
  203. }
  204. else
  205. {
  206. RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref renderingData.cullResults, drawSettings, filterSettings, m_RenderStateBlock, ref passData.rendererListHdl);
  207. RenderingUtils.CreateRendererListObjectsWithError(renderGraph, ref renderingData.cullResults, camera, filterSettings, sortFlags, ref passData.objectsWithErrorRendererListHdl);
  208. }
  209. }
  210. else
  211. {
  212. if (activeDebugHandler != null)
  213. {
  214. passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(context, ref renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock);
  215. }
  216. else
  217. {
  218. RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref renderingData.cullResults, drawSettings, filterSettings, m_RenderStateBlock, ref passData.rendererList);
  219. RenderingUtils.CreateRendererListObjectsWithError(context, ref renderingData.cullResults, camera, filterSettings, sortFlags, ref passData.objectsWithErrorRendererList);
  220. }
  221. }
  222. }
  223. internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle colorTarget, TextureHandle depthTarget, TextureHandle mainShadowsTexture, TextureHandle additionalShadowsTexture, uint batchLayerMask = uint.MaxValue)
  224. {
  225. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  226. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  227. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  228. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  229. using (var builder = renderGraph.AddRasterRenderPass<PassData>(profilingSampler == null ? "" : profilingSampler.name, out var passData, profilingSampler))
  230. {
  231. builder.UseAllGlobalTextures(true);
  232. InitPassData(cameraData, ref passData, batchLayerMask, resourceData.isActiveTargetBackBuffer);
  233. if (colorTarget.IsValid())
  234. {
  235. passData.albedoHdl = colorTarget;
  236. builder.SetRenderAttachment(colorTarget, 0, AccessFlags.Write);
  237. }
  238. if (depthTarget.IsValid())
  239. {
  240. passData.depthHdl = depthTarget;
  241. builder.SetRenderAttachmentDepth(depthTarget, AccessFlags.Write);
  242. }
  243. if (mainShadowsTexture.IsValid())
  244. builder.UseTexture(mainShadowsTexture, AccessFlags.Read);
  245. if (additionalShadowsTexture.IsValid())
  246. builder.UseTexture(additionalShadowsTexture, AccessFlags.Read);
  247. TextureHandle ssaoTexture = resourceData.ssaoTexture;
  248. if (ssaoTexture.IsValid())
  249. builder.UseTexture(ssaoTexture, AccessFlags.Read);
  250. RenderGraphUtils.UseDBufferIfValid(builder, resourceData);
  251. InitRendererLists(renderingData, cameraData, lightData, ref passData, default(ScriptableRenderContext), renderGraph, true);
  252. var activeDebugHandler = GetActiveDebugHandler(cameraData);
  253. if (activeDebugHandler != null)
  254. {
  255. passData.debugRendererLists.PrepareRendererListForRasterPass(builder);
  256. }
  257. else
  258. {
  259. builder.UseRendererList(passData.rendererListHdl);
  260. builder.UseRendererList(passData.objectsWithErrorRendererListHdl);
  261. }
  262. builder.AllowPassCulling(false);
  263. builder.AllowGlobalStateModification(true);
  264. if (cameraData.xr.enabled)
  265. {
  266. bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
  267. builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
  268. }
  269. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  270. {
  271. // Currently we only need to call this additional pass when the user
  272. // doesn't want transparent objects to receive shadows
  273. if (!data.isOpaque && !data.shouldTransparentsReceiveShadows)
  274. TransparentSettingsPass.ExecutePass(context.cmd, data.shouldTransparentsReceiveShadows);
  275. bool yFlip = data.cameraData.IsRenderTargetProjectionMatrixFlipped(data.albedoHdl, data.depthHdl);
  276. ExecutePass(context.cmd, data, data.rendererListHdl, data.objectsWithErrorRendererListHdl, yFlip);
  277. });
  278. }
  279. }
  280. }
  281. /// <summary>
  282. /// Extension of DrawObjectPass that also output Rendering Layers Texture as second render target.
  283. /// </summary>
  284. internal class DrawObjectsWithRenderingLayersPass : DrawObjectsPass
  285. {
  286. RTHandle[] m_ColorTargetIndentifiers;
  287. RTHandle m_DepthTargetIndentifiers;
  288. /// <summary>
  289. /// Creates a new <c>DrawObjectsWithRenderingLayersPass</c> instance.
  290. /// </summary>
  291. /// <param name="profilerTag">The profiler tag used with the pass.</param>
  292. /// <param name="opaque">Marks whether the objects are opaque or transparent.</param>
  293. /// <param name="evt">The <c>RenderPassEvent</c> to use.</param>
  294. /// <param name="renderQueueRange">The <c>RenderQueueRange</c> to use for creating filtering settings that control what objects get rendered.</param>
  295. /// <param name="layerMask">The layer mask to use for creating filtering settings that control what objects get rendered.</param>
  296. /// <param name="stencilState">The stencil settings to use with this poss.</param>
  297. /// <param name="stencilReference">The stencil reference value to use with this pass.</param>
  298. public DrawObjectsWithRenderingLayersPass(URPProfileId profilerTag, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference) :
  299. base(profilerTag, opaque, evt, renderQueueRange, layerMask, stencilState, stencilReference)
  300. {
  301. m_ColorTargetIndentifiers = new RTHandle[2];
  302. }
  303. /// <summary>
  304. /// Sets up the pass.
  305. /// </summary>
  306. /// <param name="colorAttachment">Color attachment handle.</param>
  307. /// <param name="renderingLayersTexture">Texture used with rendering layers.</param>
  308. /// <param name="depthAttachment">Depth attachment handle.</param>
  309. /// <exception cref="ArgumentException"></exception>
  310. public void Setup(RTHandle colorAttachment, RTHandle renderingLayersTexture, RTHandle depthAttachment)
  311. {
  312. if (colorAttachment == null)
  313. throw new ArgumentException("Color attachment can not be null", "colorAttachment");
  314. if (renderingLayersTexture == null)
  315. throw new ArgumentException("Rendering layers attachment can not be null", "renderingLayersTexture");
  316. if (depthAttachment == null)
  317. throw new ArgumentException("Depth attachment can not be null", "depthAttachment");
  318. m_ColorTargetIndentifiers[0] = colorAttachment;
  319. m_ColorTargetIndentifiers[1] = renderingLayersTexture;
  320. m_DepthTargetIndentifiers = depthAttachment;
  321. }
  322. /// <inheritdoc/>
  323. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  324. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
  325. {
  326. // Disable obsolete warning for internal usage
  327. #pragma warning disable CS0618
  328. ConfigureTarget(m_ColorTargetIndentifiers, m_DepthTargetIndentifiers);
  329. #pragma warning restore CS0618
  330. }
  331. /// <inheritdoc/>
  332. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  333. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  334. {
  335. CommandBuffer cmd = renderingData.commandBuffer;
  336. // Enable Rendering Layers
  337. cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, true);
  338. // Execute
  339. base.Execute(context, ref renderingData);
  340. // Clean up
  341. cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, false);
  342. }
  343. private class RenderingLayersPassData
  344. {
  345. internal PassData basePassData;
  346. internal RenderingLayerUtils.MaskSize maskSize;
  347. public RenderingLayersPassData()
  348. {
  349. basePassData = new PassData();
  350. }
  351. }
  352. internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle colorTarget, TextureHandle renderingLayersTexture, TextureHandle depthTarget, TextureHandle mainShadowsTexture, TextureHandle additionalShadowsTexture, RenderingLayerUtils.MaskSize maskSize, uint batchLayerMask = uint.MaxValue)
  353. {
  354. using (var builder = renderGraph.AddRasterRenderPass<RenderingLayersPassData>(profilingSampler == null ? "" : profilingSampler.name, out var passData, profilingSampler))
  355. {
  356. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  357. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  358. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  359. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  360. InitPassData(cameraData, ref passData.basePassData, batchLayerMask);
  361. passData.maskSize = maskSize;
  362. passData.basePassData.albedoHdl = colorTarget;
  363. builder.SetRenderAttachment(colorTarget, 0, AccessFlags.Write);
  364. builder.SetRenderAttachment(renderingLayersTexture, 1, AccessFlags.Write);
  365. passData.basePassData.depthHdl = depthTarget;
  366. builder.SetRenderAttachmentDepth(depthTarget, AccessFlags.Write);
  367. if (mainShadowsTexture.IsValid())
  368. builder.UseTexture(mainShadowsTexture, AccessFlags.Read);
  369. if (additionalShadowsTexture.IsValid())
  370. builder.UseTexture(additionalShadowsTexture, AccessFlags.Read);
  371. UniversalRenderer renderer = cameraData.renderer as UniversalRenderer;
  372. if (renderer != null)
  373. {
  374. TextureHandle ssaoTexture = resourceData.ssaoTexture;
  375. if (ssaoTexture.IsValid())
  376. builder.UseTexture(ssaoTexture, AccessFlags.Read);
  377. RenderGraphUtils.UseDBufferIfValid(builder, resourceData);
  378. }
  379. InitRendererLists(renderingData, cameraData, lightData, ref passData.basePassData, default(ScriptableRenderContext), renderGraph, true);
  380. var activeDebugHandler = GetActiveDebugHandler(cameraData);
  381. if (activeDebugHandler != null)
  382. {
  383. passData.basePassData.debugRendererLists.PrepareRendererListForRasterPass(builder);
  384. }
  385. else
  386. {
  387. builder.UseRendererList(passData.basePassData.rendererListHdl);
  388. builder.UseRendererList(passData.basePassData.objectsWithErrorRendererListHdl);
  389. }
  390. builder.AllowPassCulling(false);
  391. // Required here because of RenderingLayerUtils.SetupProperties
  392. builder.AllowGlobalStateModification(true);
  393. if (cameraData.xr.enabled)
  394. {
  395. bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
  396. builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
  397. }
  398. builder.SetRenderFunc((RenderingLayersPassData data, RasterGraphContext context) =>
  399. {
  400. // Enable Rendering Layers
  401. context.cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, true);
  402. RenderingLayerUtils.SetupProperties(context.cmd, data.maskSize);
  403. // Currently we only need to call this additional pass when the user
  404. // doesn't want transparent objects to receive shadows
  405. if (!data.basePassData.isOpaque && !data.basePassData.shouldTransparentsReceiveShadows)
  406. TransparentSettingsPass.ExecutePass(context.cmd, data.basePassData.shouldTransparentsReceiveShadows);
  407. bool yFlip = data.basePassData.cameraData.IsRenderTargetProjectionMatrixFlipped(data.basePassData.albedoHdl, data.basePassData.depthHdl);
  408. // Execute
  409. ExecutePass(context.cmd, data.basePassData, data.basePassData.rendererListHdl, data.basePassData.objectsWithErrorRendererListHdl, yFlip);
  410. // Clean up
  411. context.cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, false);
  412. });
  413. }
  414. }
  415. }
  416. }