Nenhuma descrição
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

DecalRendererFeature.cs 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. using System.Diagnostics;
  2. using UnityEngine.Assertions;
  3. using UnityEngine.Rendering.Universal.Internal;
  4. #if UNITY_EDITOR
  5. using ShaderKeywordFilter = UnityEditor.ShaderKeywordFilter;
  6. #endif
  7. namespace UnityEngine.Rendering.Universal
  8. {
  9. internal enum DecalSurfaceData
  10. {
  11. [Tooltip("Decals will affect only base color and emission.")]
  12. Albedo,
  13. [Tooltip("Decals will affect only base color, normal and emission.")]
  14. AlbedoNormal,
  15. [Tooltip("Decals will affect base color, normal, metallic, ambient occlusion, smoothness and emission.")]
  16. AlbedoNormalMAOS,
  17. }
  18. internal enum DecalTechnique
  19. {
  20. Invalid,
  21. DBuffer,
  22. ScreenSpace,
  23. GBuffer,
  24. }
  25. internal enum DecalTechniqueOption
  26. {
  27. [Tooltip("Automatically selects technique based on build platform.")]
  28. Automatic,
  29. [Tooltip("Renders decals into DBuffer and then applied during opaque rendering. Requires DepthNormal prepass which makes not viable solution for the tile based renderers common on mobile.")]
  30. [InspectorName("DBuffer")]
  31. DBuffer,
  32. [Tooltip("Renders decals after opaque objects with normal reconstructed from depth. The decals are simply rendered as mesh on top of opaque ones, as result does not support blending per single surface data (etc. normal blending only).")]
  33. ScreenSpace,
  34. }
  35. [System.Serializable]
  36. internal class DBufferSettings
  37. {
  38. public DecalSurfaceData surfaceData = DecalSurfaceData.AlbedoNormalMAOS;
  39. }
  40. internal enum DecalNormalBlend
  41. {
  42. [Tooltip("Low quality of normal reconstruction (Uses 1 sample).")]
  43. Low,
  44. [Tooltip("Medium quality of normal reconstruction (Uses 5 samples).")]
  45. Medium,
  46. [Tooltip("High quality of normal reconstruction (Uses 9 samples).")]
  47. High,
  48. }
  49. [System.Serializable]
  50. internal class DecalScreenSpaceSettings
  51. {
  52. public DecalNormalBlend normalBlend = DecalNormalBlend.Low;
  53. }
  54. [System.Serializable]
  55. internal class DecalSettings
  56. {
  57. public DecalTechniqueOption technique = DecalTechniqueOption.Automatic;
  58. public float maxDrawDistance = 1000f;
  59. #if UNITY_EDITOR
  60. [ShaderKeywordFilter.ApplyRulesIfNotGraphicsAPI(GraphicsDeviceType.OpenGLES3, GraphicsDeviceType.OpenGLCore)]
  61. [ShaderKeywordFilter.SelectIf(true, overridePriority: true, keywordNames: ShaderKeywordStrings.DecalLayers)]
  62. #endif
  63. public bool decalLayers = false;
  64. public DBufferSettings dBufferSettings;
  65. public DecalScreenSpaceSettings screenSpaceSettings;
  66. }
  67. internal class SharedDecalEntityManager : System.IDisposable
  68. {
  69. private DecalEntityManager m_DecalEntityManager;
  70. private int m_ReferenceCounter;
  71. public DecalEntityManager Get()
  72. {
  73. if (m_DecalEntityManager == null)
  74. {
  75. Assert.AreEqual(m_ReferenceCounter, 0);
  76. m_DecalEntityManager = new DecalEntityManager();
  77. var decalProjectors = GameObject.FindObjectsByType<DecalProjector>(FindObjectsSortMode.InstanceID);
  78. foreach (var decalProjector in decalProjectors)
  79. {
  80. if (!decalProjector.isActiveAndEnabled || m_DecalEntityManager.IsValid(decalProjector.decalEntity))
  81. continue;
  82. decalProjector.decalEntity = m_DecalEntityManager.CreateDecalEntity(decalProjector);
  83. }
  84. DecalProjector.onDecalAdd += OnDecalAdd;
  85. DecalProjector.onDecalRemove += OnDecalRemove;
  86. DecalProjector.onDecalPropertyChange += OnDecalPropertyChange;
  87. DecalProjector.onDecalMaterialChange += OnDecalMaterialChange;
  88. DecalProjector.onAllDecalPropertyChange += OnAllDecalPropertyChange;
  89. }
  90. m_ReferenceCounter++;
  91. return m_DecalEntityManager;
  92. }
  93. public void Release(DecalEntityManager decalEntityManager)
  94. {
  95. if (m_ReferenceCounter == 0)
  96. return;
  97. m_ReferenceCounter--;
  98. if (m_ReferenceCounter == 0)
  99. {
  100. Dispose();
  101. }
  102. }
  103. public void Dispose()
  104. {
  105. m_DecalEntityManager.Dispose();
  106. m_DecalEntityManager = null;
  107. m_ReferenceCounter = 0;
  108. DecalProjector.onDecalAdd -= OnDecalAdd;
  109. DecalProjector.onDecalRemove -= OnDecalRemove;
  110. DecalProjector.onDecalPropertyChange -= OnDecalPropertyChange;
  111. DecalProjector.onDecalMaterialChange -= OnDecalMaterialChange;
  112. DecalProjector.onAllDecalPropertyChange -= OnAllDecalPropertyChange;
  113. }
  114. private void OnDecalAdd(DecalProjector decalProjector)
  115. {
  116. if (!m_DecalEntityManager.IsValid(decalProjector.decalEntity))
  117. decalProjector.decalEntity = m_DecalEntityManager.CreateDecalEntity(decalProjector);
  118. }
  119. private void OnDecalRemove(DecalProjector decalProjector)
  120. {
  121. m_DecalEntityManager.DestroyDecalEntity(decalProjector.decalEntity);
  122. }
  123. private void OnDecalPropertyChange(DecalProjector decalProjector)
  124. {
  125. if (m_DecalEntityManager.IsValid(decalProjector.decalEntity))
  126. m_DecalEntityManager.UpdateDecalEntityData(decalProjector.decalEntity, decalProjector);
  127. }
  128. private void OnAllDecalPropertyChange()
  129. {
  130. m_DecalEntityManager.UpdateAllDecalEntitiesData();
  131. }
  132. private void OnDecalMaterialChange(DecalProjector decalProjector)
  133. {
  134. // Decal will end up in new chunk after material change
  135. OnDecalRemove(decalProjector);
  136. OnDecalAdd(decalProjector);
  137. }
  138. }
  139. /// <summary>
  140. /// The class for the decal renderer feature.
  141. /// </summary>
  142. [SupportedOnRenderer(typeof(UniversalRendererData))]
  143. [DisallowMultipleRendererFeature("Decal")]
  144. [Tooltip("With this Renderer Feature, Unity can project specific Materials (decals) onto other objects in the Scene.")]
  145. [URPHelpURL("renderer-feature-decal")]
  146. public class DecalRendererFeature : ScriptableRendererFeature
  147. {
  148. private static SharedDecalEntityManager sharedDecalEntityManager { get; } = new SharedDecalEntityManager();
  149. [SerializeField]
  150. private DecalSettings m_Settings = new DecalSettings();
  151. private DecalTechnique m_Technique = DecalTechnique.Invalid;
  152. private DBufferSettings m_DBufferSettings;
  153. private DecalScreenSpaceSettings m_ScreenSpaceSettings;
  154. private bool m_RecreateSystems;
  155. private DecalPreviewPass m_DecalPreviewPass;
  156. // Entities
  157. private DecalEntityManager m_DecalEntityManager;
  158. private DecalUpdateCachedSystem m_DecalUpdateCachedSystem;
  159. private DecalUpdateCullingGroupSystem m_DecalUpdateCullingGroupSystem;
  160. private DecalUpdateCulledSystem m_DecalUpdateCulledSystem;
  161. private DecalCreateDrawCallSystem m_DecalCreateDrawCallSystem;
  162. private DecalDrawErrorSystem m_DrawErrorSystem;
  163. // DBuffer
  164. private DBufferCopyDepthPass m_CopyDepthPass;
  165. private DBufferRenderPass m_DBufferRenderPass;
  166. private DecalForwardEmissivePass m_ForwardEmissivePass;
  167. private DecalDrawDBufferSystem m_DecalDrawDBufferSystem;
  168. private DecalDrawFowardEmissiveSystem m_DecalDrawForwardEmissiveSystem;
  169. private Material m_DBufferClearMaterial;
  170. // Screen Space
  171. private DecalScreenSpaceRenderPass m_ScreenSpaceDecalRenderPass;
  172. private DecalDrawScreenSpaceSystem m_DecalDrawScreenSpaceSystem;
  173. private DecalSkipCulledSystem m_DecalSkipCulledSystem;
  174. // GBuffer
  175. private DecalGBufferRenderPass m_GBufferRenderPass;
  176. private DecalDrawGBufferSystem m_DrawGBufferSystem;
  177. private DeferredLights m_DeferredLights;
  178. // Internal / Constants
  179. internal ref DecalSettings settings => ref m_Settings;
  180. internal bool intermediateRendering => m_Technique == DecalTechnique.DBuffer;
  181. internal bool requiresDecalLayers => m_Settings.decalLayers;
  182. internal static bool isGLDevice => SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES3 || SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLCore;
  183. /// <inheritdoc />
  184. public override void Create()
  185. {
  186. #if UNITY_EDITOR
  187. ResourceReloader.TryReloadAllNullIn(this, UniversalRenderPipelineAsset.packagePath);
  188. #endif
  189. m_DecalPreviewPass = new DecalPreviewPass();
  190. m_RecreateSystems = true;
  191. }
  192. internal override bool RequireRenderingLayers(bool isDeferred, bool needsGBufferAccurateNormals, out RenderingLayerUtils.Event atEvent, out RenderingLayerUtils.MaskSize maskSize)
  193. {
  194. // In some cases the desired technique is wanted, even if not supported.
  195. // For example when building the player, so the variant can be included
  196. bool checkForInvalidTechniques = Application.isPlaying;
  197. var technique = GetTechnique(isDeferred, needsGBufferAccurateNormals, checkForInvalidTechniques);
  198. atEvent = technique == DecalTechnique.DBuffer ? RenderingLayerUtils.Event.DepthNormalPrePass : RenderingLayerUtils.Event.Opaque;
  199. maskSize = RenderingLayerUtils.MaskSize.Bits8;
  200. return requiresDecalLayers;
  201. }
  202. internal DBufferSettings GetDBufferSettings()
  203. {
  204. if (m_Settings.technique == DecalTechniqueOption.Automatic)
  205. {
  206. return new DBufferSettings() { surfaceData = DecalSurfaceData.AlbedoNormalMAOS };
  207. }
  208. else
  209. {
  210. return m_Settings.dBufferSettings;
  211. }
  212. }
  213. internal DecalScreenSpaceSettings GetScreenSpaceSettings()
  214. {
  215. if (m_Settings.technique == DecalTechniqueOption.Automatic)
  216. {
  217. return new DecalScreenSpaceSettings()
  218. {
  219. normalBlend = DecalNormalBlend.Low,
  220. };
  221. }
  222. else
  223. {
  224. return m_Settings.screenSpaceSettings;
  225. }
  226. }
  227. internal DecalTechnique GetTechnique(ScriptableRendererData renderer)
  228. {
  229. var universalRenderer = renderer as UniversalRendererData;
  230. if (universalRenderer == null)
  231. {
  232. Debug.LogError("Only universal renderer supports Decal renderer feature.");
  233. return DecalTechnique.Invalid;
  234. }
  235. bool isDeferred = universalRenderer.renderingMode == RenderingMode.Deferred;
  236. return GetTechnique(isDeferred, universalRenderer.accurateGbufferNormals);
  237. }
  238. internal DecalTechnique GetTechnique(ScriptableRenderer renderer)
  239. {
  240. var universalRenderer = renderer as UniversalRenderer;
  241. if (universalRenderer == null)
  242. {
  243. Debug.LogError("Only universal renderer supports Decal renderer feature.");
  244. return DecalTechnique.Invalid;
  245. }
  246. bool isDeferred = universalRenderer.renderingModeActual == RenderingMode.Deferred;
  247. return GetTechnique(isDeferred, universalRenderer.accurateGbufferNormals);
  248. }
  249. internal DecalTechnique GetTechnique(bool isDeferred, bool needsGBufferAccurateNormals, bool checkForInvalidTechniques = true)
  250. {
  251. DecalTechnique technique = DecalTechnique.Invalid;
  252. switch (m_Settings.technique)
  253. {
  254. case DecalTechniqueOption.Automatic:
  255. if (IsAutomaticDBuffer() || isDeferred && needsGBufferAccurateNormals)
  256. technique = DecalTechnique.DBuffer;
  257. else if (isDeferred)
  258. technique = DecalTechnique.GBuffer;
  259. else
  260. technique = DecalTechnique.ScreenSpace;
  261. break;
  262. case DecalTechniqueOption.ScreenSpace:
  263. if (isDeferred)
  264. technique = DecalTechnique.GBuffer;
  265. else
  266. technique = DecalTechnique.ScreenSpace;
  267. break;
  268. case DecalTechniqueOption.DBuffer:
  269. technique = DecalTechnique.DBuffer;
  270. break;
  271. }
  272. // In some cases the desired technique is wanted, even if not supported.
  273. // For example when building the player, so the variant can be included
  274. if (!checkForInvalidTechniques)
  275. return technique;
  276. // Check if the technique is valid
  277. if (technique == DecalTechnique.DBuffer && isGLDevice)
  278. {
  279. #if !UNITY_INCLUDE_TESTS
  280. Debug.LogError("Decal DBuffer technique is not supported with OpenGL.");
  281. #endif
  282. return DecalTechnique.Invalid;
  283. }
  284. bool mrt4 = SystemInfo.supportedRenderTargetCount >= 4;
  285. if (technique == DecalTechnique.DBuffer && !mrt4)
  286. {
  287. #if !UNITY_INCLUDE_TESTS
  288. Debug.LogError("Decal DBuffer technique requires MRT4 support.");
  289. #endif
  290. return DecalTechnique.Invalid;
  291. }
  292. if (technique == DecalTechnique.GBuffer && !mrt4)
  293. {
  294. #if !UNITY_INCLUDE_TESTS
  295. Debug.LogError("Decal useGBuffer option requires MRT4 support.");
  296. #endif
  297. return DecalTechnique.Invalid;
  298. }
  299. return technique;
  300. }
  301. private bool IsAutomaticDBuffer()
  302. {
  303. // As WebGL uses gles here we should not use DBuffer
  304. #if UNITY_EDITOR
  305. if (UnityEditor.EditorUserBuildSettings.selectedBuildTargetGroup == UnityEditor.BuildTargetGroup.WebGL)
  306. return false;
  307. #else
  308. if (Application.platform == RuntimePlatform.WebGLPlayer)
  309. return false;
  310. #endif
  311. return !PlatformAutoDetect.isShaderAPIMobileDefined;
  312. }
  313. private bool RecreateSystemsIfNeeded(ScriptableRenderer renderer, in CameraData cameraData)
  314. {
  315. if (!m_RecreateSystems)
  316. return true;
  317. m_Technique = GetTechnique(renderer);
  318. if (m_Technique == DecalTechnique.Invalid)
  319. return false;
  320. m_DBufferSettings = GetDBufferSettings();
  321. m_ScreenSpaceSettings = GetScreenSpaceSettings();
  322. var rendererShaders = GraphicsSettings.GetRenderPipelineSettings<UniversalRendererResources>();
  323. if (rendererShaders == null)
  324. return false;
  325. m_DBufferClearMaterial = CoreUtils.CreateEngineMaterial(rendererShaders.decalDBufferClear);
  326. if (m_DecalEntityManager == null)
  327. {
  328. m_DecalEntityManager = sharedDecalEntityManager.Get();
  329. }
  330. m_DecalUpdateCachedSystem = new DecalUpdateCachedSystem(m_DecalEntityManager);
  331. m_DecalUpdateCulledSystem = new DecalUpdateCulledSystem(m_DecalEntityManager);
  332. m_DecalCreateDrawCallSystem = new DecalCreateDrawCallSystem(m_DecalEntityManager, m_Settings.maxDrawDistance);
  333. if (intermediateRendering)
  334. {
  335. m_DecalUpdateCullingGroupSystem = new DecalUpdateCullingGroupSystem(m_DecalEntityManager, m_Settings.maxDrawDistance);
  336. }
  337. else
  338. {
  339. m_DecalSkipCulledSystem = new DecalSkipCulledSystem(m_DecalEntityManager);
  340. }
  341. m_DrawErrorSystem = new DecalDrawErrorSystem(m_DecalEntityManager, m_Technique);
  342. var universalRenderer = renderer as UniversalRenderer;
  343. Assert.IsNotNull(universalRenderer);
  344. switch (m_Technique)
  345. {
  346. case DecalTechnique.ScreenSpace:
  347. m_DecalDrawScreenSpaceSystem = new DecalDrawScreenSpaceSystem(m_DecalEntityManager);
  348. m_ScreenSpaceDecalRenderPass = new DecalScreenSpaceRenderPass(m_ScreenSpaceSettings,
  349. intermediateRendering ? m_DecalDrawScreenSpaceSystem : null, m_Settings.decalLayers);
  350. break;
  351. case DecalTechnique.GBuffer:
  352. m_DeferredLights = universalRenderer.deferredLights;
  353. m_DrawGBufferSystem = new DecalDrawGBufferSystem(m_DecalEntityManager);
  354. m_GBufferRenderPass = new DecalGBufferRenderPass(m_ScreenSpaceSettings,
  355. intermediateRendering ? m_DrawGBufferSystem : null, m_Settings.decalLayers);
  356. break;
  357. case DecalTechnique.DBuffer:
  358. {
  359. // the RenderPassEvent needs to be RenderPassEvent.AfterRenderingPrePasses + 1, so we are sure that if depth priming is enabled
  360. // this copy happens after the primed depth is copied, so the depth texture is available
  361. m_CopyDepthPass = new DBufferCopyDepthPass(RenderPassEvent.AfterRenderingPrePasses + 1, rendererShaders.copyDepthPS, false, universalRenderer.renderingModeActual != RenderingMode.Deferred);
  362. m_DecalDrawDBufferSystem = new DecalDrawDBufferSystem(m_DecalEntityManager);
  363. m_DBufferRenderPass = new DBufferRenderPass(m_DBufferClearMaterial, m_DBufferSettings, m_DecalDrawDBufferSystem, m_Settings.decalLayers);
  364. m_DecalDrawForwardEmissiveSystem = new DecalDrawFowardEmissiveSystem(m_DecalEntityManager);
  365. m_ForwardEmissivePass = new DecalForwardEmissivePass(m_DecalDrawForwardEmissiveSystem);
  366. }
  367. break;
  368. }
  369. m_RecreateSystems = false;
  370. return true;
  371. }
  372. /// <inheritdoc />
  373. public override void OnCameraPreCull(ScriptableRenderer renderer, in CameraData cameraData)
  374. {
  375. if (cameraData.cameraType == CameraType.Preview)
  376. return;
  377. bool isValid = RecreateSystemsIfNeeded(renderer, cameraData);
  378. if (!isValid)
  379. return;
  380. ChangeAdaptivePerformanceDrawDistances();
  381. m_DecalEntityManager.Update();
  382. m_DecalUpdateCachedSystem.Execute();
  383. if (intermediateRendering)
  384. {
  385. m_DecalUpdateCullingGroupSystem.Execute(cameraData.camera);
  386. }
  387. else
  388. {
  389. m_DecalSkipCulledSystem.Execute(cameraData.camera);
  390. m_DecalCreateDrawCallSystem.Execute();
  391. if (m_Technique == DecalTechnique.ScreenSpace)
  392. {
  393. m_DecalDrawScreenSpaceSystem.Execute(cameraData);
  394. }
  395. else if (m_Technique == DecalTechnique.GBuffer)
  396. {
  397. m_DrawGBufferSystem.Execute(cameraData);
  398. }
  399. }
  400. m_DrawErrorSystem.Execute(cameraData);
  401. }
  402. /// <inheritdoc />
  403. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
  404. {
  405. if (UniversalRenderer.IsOffscreenDepthTexture(ref renderingData.cameraData))
  406. return;
  407. if (renderingData.cameraData.cameraType == CameraType.Preview)
  408. {
  409. renderer.EnqueuePass(m_DecalPreviewPass);
  410. return;
  411. }
  412. bool isValid = RecreateSystemsIfNeeded(renderer, renderingData.cameraData);
  413. if (!isValid)
  414. return;
  415. ChangeAdaptivePerformanceDrawDistances();
  416. if (intermediateRendering)
  417. {
  418. m_DecalUpdateCulledSystem.Execute();
  419. m_DecalCreateDrawCallSystem.Execute();
  420. }
  421. if (m_Technique == DecalTechnique.DBuffer)
  422. {
  423. var universalRenderer = renderer as UniversalRenderer;
  424. if (universalRenderer.renderingModeActual == RenderingMode.Deferred)
  425. {
  426. m_CopyDepthPass.CopyToDepth = false;
  427. }
  428. else
  429. {
  430. m_CopyDepthPass.CopyToDepth = true;
  431. m_CopyDepthPass.MssaSamples = 1;
  432. }
  433. }
  434. switch (m_Technique)
  435. {
  436. case DecalTechnique.ScreenSpace:
  437. renderer.EnqueuePass(m_ScreenSpaceDecalRenderPass);
  438. break;
  439. case DecalTechnique.GBuffer:
  440. m_GBufferRenderPass.Setup(m_DeferredLights);
  441. renderer.EnqueuePass(m_GBufferRenderPass);
  442. break;
  443. case DecalTechnique.DBuffer:
  444. renderer.EnqueuePass(m_CopyDepthPass);
  445. renderer.EnqueuePass(m_DBufferRenderPass);
  446. renderer.EnqueuePass(m_ForwardEmissivePass);
  447. break;
  448. }
  449. }
  450. internal override bool SupportsNativeRenderPass()
  451. {
  452. return m_Technique == DecalTechnique.GBuffer || m_Technique == DecalTechnique.ScreenSpace;
  453. }
  454. /// <inheritdoc />
  455. public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
  456. {
  457. // Disable obsolete warning for internal usage
  458. #pragma warning disable CS0618
  459. if (renderer.cameraColorTargetHandle == null)
  460. return;
  461. if (m_Technique == DecalTechnique.DBuffer)
  462. {
  463. m_DBufferRenderPass.Setup(renderingData.cameraData);
  464. var universalRenderer = renderer as UniversalRenderer;
  465. if (universalRenderer.renderingModeActual == RenderingMode.Deferred)
  466. {
  467. m_DBufferRenderPass.Setup(renderingData.cameraData, renderer.cameraDepthTargetHandle);
  468. m_CopyDepthPass.Setup(
  469. renderer.cameraDepthTargetHandle,
  470. universalRenderer.m_DepthTexture
  471. );
  472. }
  473. else
  474. {
  475. m_DBufferRenderPass.Setup(renderingData.cameraData);
  476. m_CopyDepthPass.Setup(
  477. universalRenderer.m_DepthTexture,
  478. m_DBufferRenderPass.dBufferDepth
  479. );
  480. m_CopyDepthPass.CopyToDepth = true;
  481. m_CopyDepthPass.MssaSamples = 1;
  482. }
  483. }
  484. else if (m_Technique == DecalTechnique.GBuffer && m_DeferredLights.UseFramebufferFetch)
  485. {
  486. // Need to call Configure for both of these passes to setup input attachments as first frame otherwise will raise errors
  487. m_GBufferRenderPass.Configure(null, renderingData.cameraData.cameraTargetDescriptor);
  488. }
  489. #pragma warning restore CS0618
  490. }
  491. /// <inheritdoc />
  492. protected override void Dispose(bool disposing)
  493. {
  494. m_DBufferRenderPass?.Dispose();
  495. m_CopyDepthPass?.Dispose();
  496. CoreUtils.Destroy(m_DBufferClearMaterial);
  497. if (m_DecalEntityManager != null)
  498. {
  499. m_DecalEntityManager = null;
  500. sharedDecalEntityManager.Release(m_DecalEntityManager);
  501. }
  502. }
  503. [Conditional("ADAPTIVE_PERFORMANCE_4_0_0_OR_NEWER")]
  504. private void ChangeAdaptivePerformanceDrawDistances()
  505. {
  506. #if ADAPTIVE_PERFORMANCE_4_0_0_OR_NEWER
  507. if (UniversalRenderPipeline.asset.useAdaptivePerformance)
  508. {
  509. if (m_DecalCreateDrawCallSystem != null)
  510. {
  511. m_DecalCreateDrawCallSystem.maxDrawDistance = AdaptivePerformance.AdaptivePerformanceRenderSettings.DecalsDrawDistance;
  512. }
  513. if (m_DecalUpdateCullingGroupSystem != null)
  514. {
  515. m_DecalUpdateCullingGroupSystem.boundingDistance = AdaptivePerformance.AdaptivePerformanceRenderSettings.DecalsDrawDistance;
  516. }
  517. }
  518. #endif
  519. }
  520. }
  521. }