UniversalRenderPipelineAsset.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. using System;
  2. using UnityEngine.Scripting.APIUpdating;
  3. #if UNITY_EDITOR
  4. using UnityEditor;
  5. using UnityEditor.ProjectWindowCallback;
  6. using System.IO;
  7. #endif
  8. using System.ComponentModel;
  9. namespace UnityEngine.Rendering.LWRP
  10. {
  11. [Obsolete("LWRP -> Universal (UnityUpgradable) -> UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset", true)]
  12. public class LightweightRenderPipelineAsset
  13. {
  14. }
  15. }
  16. namespace UnityEngine.Rendering.Universal
  17. {
  18. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShadowCascadesOption
  19. {
  20. NoCascades,
  21. TwoCascades,
  22. FourCascades,
  23. }
  24. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShadowQuality
  25. {
  26. Disabled,
  27. HardShadows,
  28. SoftShadows,
  29. }
  30. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShadowResolution
  31. {
  32. _256 = 256,
  33. _512 = 512,
  34. _1024 = 1024,
  35. _2048 = 2048,
  36. _4096 = 4096
  37. }
  38. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum MsaaQuality
  39. {
  40. Disabled = 1,
  41. _2x = 2,
  42. _4x = 4,
  43. _8x = 8
  44. }
  45. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum Downsampling
  46. {
  47. None,
  48. _2xBilinear,
  49. _4xBox,
  50. _4xBilinear
  51. }
  52. internal enum DefaultMaterialType
  53. {
  54. Standard,
  55. Particle,
  56. Terrain,
  57. Sprite,
  58. UnityBuiltinDefault
  59. }
  60. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum LightRenderingMode
  61. {
  62. Disabled = 0,
  63. PerVertex = 2,
  64. PerPixel = 1,
  65. }
  66. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShaderVariantLogLevel
  67. {
  68. Disabled,
  69. OnlyUniversalRPShaders,
  70. AllShaders,
  71. }
  72. public enum PipelineDebugLevel
  73. {
  74. Disabled,
  75. Profiling,
  76. }
  77. [MovedFrom("UnityEngine.Rendering.LWRP")] public enum RendererType
  78. {
  79. Custom,
  80. ForwardRenderer,
  81. _2DRenderer,
  82. }
  83. /// <summary>
  84. /// The available color grading modes to use for the Project.
  85. /// </summary>
  86. public enum ColorGradingMode
  87. {
  88. /// <summary>
  89. /// This mode follows a more classic workflow. Unity applies a limited range of color
  90. /// grading after tonemapping.
  91. /// </summary>
  92. LowDynamicRange,
  93. /// <summary>
  94. /// This mode works best for high precision grading similar to movie production workflow.
  95. /// Unity applies color grading before tonemapping.
  96. /// </summary>
  97. HighDynamicRange
  98. }
  99. /// <summary>
  100. /// The available post-processing solutions to use for the project. To future proof your
  101. /// application, use <see cref="Integrated"/> instead of the comparability mode. Only use
  102. /// compatibility mode if your project still uses the Post-processing V2 package, but be aware
  103. /// that Unity plans to deprecate Post-processing V2 support for the Universal Render Pipeline
  104. /// in the near future.
  105. /// </summary>
  106. public enum PostProcessingFeatureSet
  107. {
  108. /// <summary>
  109. /// The integrated post-processing stack.
  110. /// </summary>
  111. Integrated,
  112. /// <summary>
  113. /// The post-processing stack v2. This option only works if the package is installed in the
  114. /// project. Be aware that Unity plans to deprecate Post-processing V2 support for the
  115. /// Universal Render Pipeline in the near future.
  116. /// </summary>
  117. PostProcessingV2
  118. }
  119. public class UniversalRenderPipelineAsset : RenderPipelineAsset, ISerializationCallbackReceiver
  120. {
  121. Shader m_DefaultShader;
  122. ScriptableRenderer[] m_Renderers = new ScriptableRenderer[1];
  123. // Default values set when a new UniversalRenderPipeline asset is created
  124. [SerializeField] int k_AssetVersion = 5;
  125. [SerializeField] int k_AssetPreviousVersion = 5;
  126. // Deprecated settings for upgrading sakes
  127. [SerializeField] RendererType m_RendererType = RendererType.ForwardRenderer;
  128. [EditorBrowsable(EditorBrowsableState.Never)]
  129. [SerializeField] internal ScriptableRendererData m_RendererData = null;
  130. // Renderer settings
  131. [SerializeField] internal ScriptableRendererData[] m_RendererDataList = new ScriptableRendererData[1];
  132. [SerializeField] internal int m_DefaultRendererIndex = 0;
  133. // General settings
  134. [SerializeField] bool m_RequireDepthTexture = false;
  135. [SerializeField] bool m_RequireOpaqueTexture = false;
  136. [SerializeField] Downsampling m_OpaqueDownsampling = Downsampling._2xBilinear;
  137. [SerializeField] bool m_SupportsTerrainHoles = true;
  138. // Quality settings
  139. [SerializeField] bool m_SupportsHDR = false;
  140. [SerializeField] MsaaQuality m_MSAA = MsaaQuality.Disabled;
  141. [SerializeField] float m_RenderScale = 1.0f;
  142. // TODO: Shader Quality Tiers
  143. // Main directional light Settings
  144. [SerializeField] LightRenderingMode m_MainLightRenderingMode = LightRenderingMode.PerPixel;
  145. [SerializeField] bool m_MainLightShadowsSupported = true;
  146. [SerializeField] ShadowResolution m_MainLightShadowmapResolution = ShadowResolution._2048;
  147. // Additional lights settings
  148. [SerializeField] LightRenderingMode m_AdditionalLightsRenderingMode = LightRenderingMode.PerPixel;
  149. [SerializeField] int m_AdditionalLightsPerObjectLimit = 4;
  150. [SerializeField] bool m_AdditionalLightShadowsSupported = false;
  151. [SerializeField] ShadowResolution m_AdditionalLightsShadowmapResolution = ShadowResolution._512;
  152. // Shadows Settings
  153. [SerializeField] float m_ShadowDistance = 50.0f;
  154. [SerializeField] ShadowCascadesOption m_ShadowCascades = ShadowCascadesOption.NoCascades;
  155. [SerializeField] float m_Cascade2Split = 0.25f;
  156. [SerializeField] Vector3 m_Cascade4Split = new Vector3(0.067f, 0.2f, 0.467f);
  157. [SerializeField] float m_ShadowDepthBias = 1.0f;
  158. [SerializeField] float m_ShadowNormalBias = 1.0f;
  159. [SerializeField] bool m_SoftShadowsSupported = false;
  160. // Advanced settings
  161. [SerializeField] bool m_UseSRPBatcher = true;
  162. [SerializeField] bool m_SupportsDynamicBatching = false;
  163. [SerializeField] bool m_MixedLightingSupported = true;
  164. [SerializeField] PipelineDebugLevel m_DebugLevel = PipelineDebugLevel.Disabled;
  165. // Post-processing settings
  166. #pragma warning disable 414 // 'field' is assigned but never used
  167. [SerializeField] PostProcessingFeatureSet m_PostProcessingFeatureSet = PostProcessingFeatureSet.Integrated;
  168. #pragma warning restore 414
  169. [SerializeField] ColorGradingMode m_ColorGradingMode = ColorGradingMode.LowDynamicRange;
  170. [SerializeField] int m_ColorGradingLutSize = 32;
  171. // Deprecated settings
  172. [SerializeField] ShadowQuality m_ShadowType = ShadowQuality.HardShadows;
  173. [SerializeField] bool m_LocalShadowsSupported = false;
  174. [SerializeField] ShadowResolution m_LocalShadowsAtlasResolution = ShadowResolution._256;
  175. [SerializeField] int m_MaxPixelLights = 0;
  176. [SerializeField] ShadowResolution m_ShadowAtlasResolution = ShadowResolution._256;
  177. [SerializeField] ShaderVariantLogLevel m_ShaderVariantLogLevel = ShaderVariantLogLevel.Disabled;
  178. // Note: A lut size of 16^3 is barely usable with the HDR grading mode. 32 should be the
  179. // minimum, the lut being encoded in log. Lower sizes would work better with an additional
  180. // 1D shaper lut but for now we'll keep it simple.
  181. public const int k_MinLutSize = 16;
  182. public const int k_MaxLutSize = 65;
  183. #if UNITY_EDITOR
  184. [NonSerialized]
  185. internal UniversalRenderPipelineEditorResources m_EditorResourcesAsset;
  186. public static readonly string packagePath = "Packages/com.unity.render-pipelines.universal";
  187. public static UniversalRenderPipelineAsset Create(ScriptableRendererData rendererData = null)
  188. {
  189. // Create Universal RP Asset
  190. var instance = CreateInstance<UniversalRenderPipelineAsset>();
  191. if (rendererData != null)
  192. instance.m_RendererDataList[0] = rendererData;
  193. else
  194. instance.m_RendererDataList[0] = CreateInstance<ForwardRendererData>();
  195. // Initialize default Renderer
  196. instance.m_EditorResourcesAsset = LoadResourceFile<UniversalRenderPipelineEditorResources>();
  197. return instance;
  198. }
  199. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")]
  200. internal class CreateUniversalPipelineAsset : EndNameEditAction
  201. {
  202. public override void Action(int instanceId, string pathName, string resourceFile)
  203. {
  204. //Create asset
  205. AssetDatabase.CreateAsset(Create(CreateRendererAsset(pathName, RendererType.ForwardRenderer)), pathName);
  206. }
  207. }
  208. [MenuItem("Assets/Create/Rendering/Universal Render Pipeline/Pipeline Asset (Forward Renderer)", priority = CoreUtils.assetCreateMenuPriority1)]
  209. static void CreateUniversalPipeline()
  210. {
  211. ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, CreateInstance<CreateUniversalPipelineAsset>(),
  212. "UniversalRenderPipelineAsset.asset", null, null);
  213. }
  214. static ScriptableRendererData CreateRendererAsset(string path, RendererType type, bool relativePath = true)
  215. {
  216. ScriptableRendererData data = CreateRendererData(type);
  217. string dataPath;
  218. if (relativePath)
  219. dataPath =
  220. $"{Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path))}_Renderer{Path.GetExtension(path)}";
  221. else
  222. dataPath = path;
  223. AssetDatabase.CreateAsset(data, dataPath);
  224. return data;
  225. }
  226. static ScriptableRendererData CreateRendererData(RendererType type)
  227. {
  228. switch (type)
  229. {
  230. case RendererType.ForwardRenderer:
  231. return CreateInstance<ForwardRendererData>();
  232. // 2D renderer is experimental
  233. case RendererType._2DRenderer:
  234. return CreateInstance<Experimental.Rendering.Universal.Renderer2DData>();
  235. // Forward Renderer is the fallback renderer that works on all platforms
  236. default:
  237. return CreateInstance<ForwardRendererData>();
  238. }
  239. }
  240. //[MenuItem("Assets/Create/Rendering/Universal Pipeline Editor Resources", priority = CoreUtils.assetCreateMenuPriority1)]
  241. static void CreateUniversalPipelineEditorResources()
  242. {
  243. var instance = CreateInstance<UniversalRenderPipelineEditorResources>();
  244. ResourceReloader.ReloadAllNullIn(instance, packagePath);
  245. AssetDatabase.CreateAsset(instance, string.Format("Assets/{0}.asset", typeof(UniversalRenderPipelineEditorResources).Name));
  246. }
  247. static T LoadResourceFile<T>() where T : ScriptableObject
  248. {
  249. T resourceAsset = null;
  250. var guids = AssetDatabase.FindAssets(typeof(T).Name + " t:scriptableobject", new[] { "Assets" });
  251. foreach (string guid in guids)
  252. {
  253. string path = AssetDatabase.GUIDToAssetPath(guid);
  254. resourceAsset = AssetDatabase.LoadAssetAtPath<T>(path);
  255. if (resourceAsset != null)
  256. break;
  257. }
  258. // There's currently an issue that prevents FindAssets from find resources withing the package folder.
  259. if (resourceAsset == null)
  260. {
  261. string path = packagePath + "/Runtime/Data/" + typeof(T).Name + ".asset";
  262. resourceAsset = AssetDatabase.LoadAssetAtPath<T>(path);
  263. }
  264. // Validate the resource file
  265. ResourceReloader.TryReloadAllNullIn(resourceAsset, packagePath);
  266. return resourceAsset;
  267. }
  268. UniversalRenderPipelineEditorResources editorResources
  269. {
  270. get
  271. {
  272. if (m_EditorResourcesAsset == null)
  273. m_EditorResourcesAsset = LoadResourceFile<UniversalRenderPipelineEditorResources>();
  274. return m_EditorResourcesAsset;
  275. }
  276. }
  277. #endif
  278. public ScriptableRendererData LoadBuiltinRendererData(RendererType type = RendererType.ForwardRenderer)
  279. {
  280. #if UNITY_EDITOR
  281. EditorUtility.SetDirty(this);
  282. return m_RendererDataList[0] =
  283. CreateRendererAsset("Assets/ForwardRenderer.asset", type, false);
  284. #else
  285. m_RendererDataList[0] = null;
  286. return m_RendererDataList[0];
  287. #endif
  288. }
  289. protected override RenderPipeline CreatePipeline()
  290. {
  291. if (m_RendererDataList == null)
  292. m_RendererDataList = new ScriptableRendererData[1];
  293. // If no data we can't create pipeline instance
  294. if (m_RendererDataList[0] == null)
  295. {
  296. // If previous version and current version are miss-matched then we are waiting for the upgrader to kick in
  297. if(k_AssetPreviousVersion != k_AssetVersion)
  298. return null;
  299. Debug.LogError(
  300. $"Default Renderer is missing, make sure there is a Renderer assigned as the default on the current Universal RP asset:{UniversalRenderPipeline.asset.name}",
  301. this);
  302. return null;
  303. }
  304. CreateRenderers();
  305. return new UniversalRenderPipeline(this);
  306. }
  307. void DestroyRenderers()
  308. {
  309. foreach (var renderer in m_Renderers)
  310. renderer?.Dispose();
  311. }
  312. protected override void OnValidate()
  313. {
  314. DestroyRenderers();
  315. // This will call RenderPipelineManager.CleanupRenderPipeline that in turn disposes the render pipeline instance and
  316. // assign pipeline asset reference to null
  317. base.OnValidate();
  318. }
  319. protected override void OnDisable()
  320. {
  321. DestroyRenderers();
  322. // This will call RenderPipelineManager.CleanupRenderPipeline that in turn disposes the render pipeline instance and
  323. // assign pipeline asset reference to null
  324. base.OnDisable();
  325. }
  326. void CreateRenderers()
  327. {
  328. m_Renderers = new ScriptableRenderer[m_RendererDataList.Length];
  329. for (int i = 0; i < m_RendererDataList.Length; ++i)
  330. {
  331. if (m_RendererDataList[i] != null)
  332. m_Renderers[i] = m_RendererDataList[i].InternalCreateRenderer();
  333. }
  334. }
  335. Material GetMaterial(DefaultMaterialType materialType)
  336. {
  337. #if UNITY_EDITOR
  338. if (scriptableRendererData == null || editorResources == null)
  339. return null;
  340. var material = scriptableRendererData.GetDefaultMaterial(materialType);
  341. if (material != null)
  342. return material;
  343. switch (materialType)
  344. {
  345. case DefaultMaterialType.Standard:
  346. return editorResources.materials.lit;
  347. case DefaultMaterialType.Particle:
  348. return editorResources.materials.particleLit;
  349. case DefaultMaterialType.Terrain:
  350. return editorResources.materials.terrainLit;
  351. // Unity Builtin Default
  352. default:
  353. return null;
  354. }
  355. #else
  356. return null;
  357. #endif
  358. }
  359. /// <summary>
  360. /// Returns the default renderer being used by this pipeline.
  361. /// </summary>
  362. public ScriptableRenderer scriptableRenderer
  363. {
  364. get
  365. {
  366. if (m_RendererDataList?.Length > m_DefaultRendererIndex && m_RendererDataList[m_DefaultRendererIndex] == null)
  367. {
  368. Debug.LogError("Default renderer is missing from the current Pipeline Asset.", this);
  369. return null;
  370. }
  371. if (scriptableRendererData.isInvalidated || m_Renderers[m_DefaultRendererIndex] == null)
  372. {
  373. m_Renderers[m_DefaultRendererIndex] = scriptableRendererData.InternalCreateRenderer();
  374. }
  375. return m_Renderers[m_DefaultRendererIndex];
  376. }
  377. }
  378. /// <summary>
  379. /// Returns a renderer from the current pipeline asset
  380. /// </summary>
  381. /// <param name="index">Index to the renderer. If invalid index is passed, the default renderer is returned instead.</param>
  382. /// <returns></returns>
  383. public ScriptableRenderer GetRenderer(int index)
  384. {
  385. if (index == -1)
  386. index = m_DefaultRendererIndex;
  387. if (index >= m_RendererDataList.Length || index < 0 || m_RendererDataList[index] == null)
  388. {
  389. Debug.LogWarning(
  390. $"Renderer at index {index.ToString()} is missing, falling back to Default Renderer {m_RendererDataList[m_DefaultRendererIndex].name}",
  391. this);
  392. index = m_DefaultRendererIndex;
  393. }
  394. // RendererData list differs from RendererList. Create RendererList.
  395. if (m_Renderers == null || m_Renderers.Length < m_RendererDataList.Length)
  396. CreateRenderers();
  397. // This renderer data is outdated or invalid, we recreate the renderer
  398. // so we construct all render passes with the updated data
  399. if (m_RendererDataList[index].isInvalidated || m_Renderers[index] == null)
  400. m_Renderers[index] = m_RendererDataList[index].InternalCreateRenderer();
  401. return m_Renderers[index];
  402. }
  403. internal ScriptableRendererData scriptableRendererData
  404. {
  405. get
  406. {
  407. if (m_RendererDataList[m_DefaultRendererIndex] == null)
  408. CreatePipeline();
  409. return m_RendererDataList[m_DefaultRendererIndex];
  410. }
  411. }
  412. #if UNITY_EDITOR
  413. internal GUIContent[] rendererDisplayList
  414. {
  415. get
  416. {
  417. GUIContent[] list = new GUIContent[m_RendererDataList.Length + 1];
  418. list[0] = new GUIContent($"Default Renderer ({RendererDataDisplayName(m_RendererDataList[m_DefaultRendererIndex])})");
  419. for (var i = 1; i < list.Length; i++)
  420. {
  421. list[i] = new GUIContent($"{(i - 1).ToString()}: {RendererDataDisplayName(m_RendererDataList[i-1])}");
  422. }
  423. return list;
  424. }
  425. }
  426. string RendererDataDisplayName(ScriptableRendererData data)
  427. {
  428. if (data != null)
  429. return data.name;
  430. return "NULL (Missing RendererData)";
  431. }
  432. #endif
  433. internal int[] rendererIndexList
  434. {
  435. get
  436. {
  437. int[] list = new int[m_RendererDataList.Length + 1];
  438. for (int i = 0; i < list.Length; i++)
  439. {
  440. list[i] = i - 1;
  441. }
  442. return list;
  443. }
  444. }
  445. public bool supportsCameraDepthTexture
  446. {
  447. get { return m_RequireDepthTexture; }
  448. set { m_RequireDepthTexture = value; }
  449. }
  450. public bool supportsCameraOpaqueTexture
  451. {
  452. get { return m_RequireOpaqueTexture; }
  453. set { m_RequireOpaqueTexture = value; }
  454. }
  455. public Downsampling opaqueDownsampling
  456. {
  457. get { return m_OpaqueDownsampling; }
  458. }
  459. public bool supportsTerrainHoles
  460. {
  461. get { return m_SupportsTerrainHoles; }
  462. }
  463. public bool supportsHDR
  464. {
  465. get { return m_SupportsHDR; }
  466. set { m_SupportsHDR = value; }
  467. }
  468. public int msaaSampleCount
  469. {
  470. get { return (int)m_MSAA; }
  471. set { m_MSAA = (MsaaQuality)value; }
  472. }
  473. public float renderScale
  474. {
  475. get { return m_RenderScale; }
  476. set { m_RenderScale = ValidateRenderScale(value); }
  477. }
  478. public LightRenderingMode mainLightRenderingMode
  479. {
  480. get { return m_MainLightRenderingMode; }
  481. }
  482. public bool supportsMainLightShadows
  483. {
  484. get { return m_MainLightShadowsSupported; }
  485. }
  486. public int mainLightShadowmapResolution
  487. {
  488. get { return (int)m_MainLightShadowmapResolution; }
  489. }
  490. public LightRenderingMode additionalLightsRenderingMode
  491. {
  492. get { return m_AdditionalLightsRenderingMode; }
  493. }
  494. public int maxAdditionalLightsCount
  495. {
  496. get { return m_AdditionalLightsPerObjectLimit; }
  497. set { m_AdditionalLightsPerObjectLimit = ValidatePerObjectLights(value); }
  498. }
  499. public bool supportsAdditionalLightShadows
  500. {
  501. get { return m_AdditionalLightShadowsSupported; }
  502. }
  503. public int additionalLightsShadowmapResolution
  504. {
  505. get { return (int)m_AdditionalLightsShadowmapResolution; }
  506. }
  507. public float shadowDistance
  508. {
  509. get { return m_ShadowDistance; }
  510. set { m_ShadowDistance = Mathf.Max(0.0f, value); }
  511. }
  512. public ShadowCascadesOption shadowCascadeOption
  513. {
  514. get { return m_ShadowCascades; }
  515. set { m_ShadowCascades = value; }
  516. }
  517. public float cascade2Split
  518. {
  519. get { return m_Cascade2Split; }
  520. }
  521. public Vector3 cascade4Split
  522. {
  523. get { return m_Cascade4Split; }
  524. }
  525. public float shadowDepthBias
  526. {
  527. get { return m_ShadowDepthBias; }
  528. set { m_ShadowDepthBias = ValidateShadowBias(value); }
  529. }
  530. public float shadowNormalBias
  531. {
  532. get { return m_ShadowNormalBias; }
  533. set { m_ShadowNormalBias = ValidateShadowBias(value); }
  534. }
  535. public bool supportsSoftShadows
  536. {
  537. get { return m_SoftShadowsSupported; }
  538. }
  539. public bool supportsDynamicBatching
  540. {
  541. get { return m_SupportsDynamicBatching; }
  542. set { m_SupportsDynamicBatching = value; }
  543. }
  544. public bool supportsMixedLighting
  545. {
  546. get { return m_MixedLightingSupported; }
  547. }
  548. public ShaderVariantLogLevel shaderVariantLogLevel
  549. {
  550. get { return m_ShaderVariantLogLevel; }
  551. set { m_ShaderVariantLogLevel = value; }
  552. }
  553. public PipelineDebugLevel debugLevel
  554. {
  555. get => m_DebugLevel;
  556. }
  557. public bool useSRPBatcher
  558. {
  559. get { return m_UseSRPBatcher; }
  560. set { m_UseSRPBatcher = value; }
  561. }
  562. /// <summary>
  563. /// The post-processing solution used in the project.
  564. /// </summary>
  565. public PostProcessingFeatureSet postProcessingFeatureSet
  566. {
  567. get
  568. {
  569. #if POST_PROCESSING_STACK_2_0_0_OR_NEWER
  570. return m_PostProcessingFeatureSet;
  571. #else
  572. return PostProcessingFeatureSet.Integrated;
  573. #endif
  574. }
  575. set
  576. {
  577. #if POST_PROCESSING_STACK_2_0_0_OR_NEWER
  578. m_PostProcessingFeatureSet = value;
  579. #else
  580. m_PostProcessingFeatureSet = PostProcessingFeatureSet.Integrated;
  581. #endif
  582. }
  583. }
  584. /// <summary>
  585. /// The color grading mode used in the project.
  586. /// </summary>
  587. public ColorGradingMode colorGradingMode
  588. {
  589. get { return m_ColorGradingMode; }
  590. set { m_ColorGradingMode = value; }
  591. }
  592. /// <summary>
  593. /// The color grading LUT size used in the project. Higher sizes provide more precision, but
  594. /// have a potential cost of performance and memory use. You cannot mix and match LUT sizes,
  595. /// so decide on a size before you start the color grading process.
  596. /// </summary>
  597. public int colorGradingLutSize
  598. {
  599. get { return m_ColorGradingLutSize; }
  600. set { m_ColorGradingLutSize = Mathf.Clamp(value, k_MinLutSize, k_MaxLutSize); }
  601. }
  602. public override Material defaultMaterial
  603. {
  604. get { return GetMaterial(DefaultMaterialType.Standard); }
  605. }
  606. public override Material defaultParticleMaterial
  607. {
  608. get { return GetMaterial(DefaultMaterialType.Particle); }
  609. }
  610. public override Material defaultLineMaterial
  611. {
  612. get { return GetMaterial(DefaultMaterialType.Particle); }
  613. }
  614. public override Material defaultTerrainMaterial
  615. {
  616. get { return GetMaterial(DefaultMaterialType.Terrain); }
  617. }
  618. public override Material defaultUIMaterial
  619. {
  620. get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); }
  621. }
  622. public override Material defaultUIOverdrawMaterial
  623. {
  624. get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); }
  625. }
  626. public override Material defaultUIETC1SupportedMaterial
  627. {
  628. get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); }
  629. }
  630. public override Material default2DMaterial
  631. {
  632. get { return GetMaterial(DefaultMaterialType.Sprite); }
  633. }
  634. public override Shader defaultShader
  635. {
  636. get
  637. {
  638. #if UNITY_EDITOR
  639. // TODO: When importing project, AssetPreviewUpdater:CreatePreviewForAsset will be called multiple time
  640. // which in turns calls this property to get the default shader.
  641. // The property should never return null as, when null, it loads the data using AssetDatabase.LoadAssetAtPath.
  642. // However it seems there's an issue that LoadAssetAtPath will not load the asset in some cases. so adding the null check
  643. // here to fix template tests.
  644. if (scriptableRendererData != null)
  645. {
  646. Shader defaultShader = scriptableRendererData.GetDefaultShader();
  647. if (defaultShader != null)
  648. return defaultShader;
  649. }
  650. #endif
  651. if (m_DefaultShader == null)
  652. m_DefaultShader = Shader.Find(ShaderUtils.GetShaderPath(ShaderPathID.Lit));
  653. return m_DefaultShader;
  654. }
  655. }
  656. #if UNITY_EDITOR
  657. public override Shader autodeskInteractiveShader
  658. {
  659. get { return editorResources.shaders.autodeskInteractivePS; }
  660. }
  661. public override Shader autodeskInteractiveTransparentShader
  662. {
  663. get { return editorResources.shaders.autodeskInteractiveTransparentPS; }
  664. }
  665. public override Shader autodeskInteractiveMaskedShader
  666. {
  667. get { return editorResources.shaders.autodeskInteractiveMaskedPS; }
  668. }
  669. public override Shader terrainDetailLitShader
  670. {
  671. get { return editorResources.shaders.terrainDetailLitPS; }
  672. }
  673. public override Shader terrainDetailGrassShader
  674. {
  675. get { return editorResources.shaders.terrainDetailGrassPS; }
  676. }
  677. public override Shader terrainDetailGrassBillboardShader
  678. {
  679. get { return editorResources.shaders.terrainDetailGrassBillboardPS; }
  680. }
  681. public override Shader defaultSpeedTree7Shader
  682. {
  683. get { return editorResources.shaders.defaultSpeedTree7PS; }
  684. }
  685. public override Shader defaultSpeedTree8Shader
  686. {
  687. get { return editorResources.shaders.defaultSpeedTree8PS; }
  688. }
  689. #endif
  690. public void OnBeforeSerialize()
  691. {
  692. }
  693. public void OnAfterDeserialize()
  694. {
  695. if (k_AssetVersion < 3)
  696. {
  697. m_SoftShadowsSupported = (m_ShadowType == ShadowQuality.SoftShadows);
  698. k_AssetPreviousVersion = k_AssetVersion;
  699. k_AssetVersion = 3;
  700. }
  701. if (k_AssetVersion < 4)
  702. {
  703. m_AdditionalLightShadowsSupported = m_LocalShadowsSupported;
  704. m_AdditionalLightsShadowmapResolution = m_LocalShadowsAtlasResolution;
  705. m_AdditionalLightsPerObjectLimit = m_MaxPixelLights;
  706. m_MainLightShadowmapResolution = m_ShadowAtlasResolution;
  707. k_AssetPreviousVersion = k_AssetVersion;
  708. k_AssetVersion = 4;
  709. }
  710. if (k_AssetVersion < 5)
  711. {
  712. if (m_RendererType == RendererType.Custom)
  713. {
  714. m_RendererDataList[0] = m_RendererData;
  715. }
  716. k_AssetPreviousVersion = k_AssetVersion;
  717. k_AssetVersion = 5;
  718. }
  719. #if UNITY_EDITOR
  720. if (k_AssetPreviousVersion != k_AssetVersion)
  721. {
  722. EditorApplication.delayCall += () => UpgradeAsset(this);
  723. }
  724. #endif
  725. }
  726. #if UNITY_EDITOR
  727. static void UpgradeAsset(UniversalRenderPipelineAsset asset)
  728. {
  729. if(asset.k_AssetPreviousVersion < 5)
  730. {
  731. if (asset.m_RendererType == RendererType.ForwardRenderer)
  732. {
  733. var data = AssetDatabase.LoadAssetAtPath<ForwardRendererData>("Assets/ForwardRenderer.asset");
  734. if (data)
  735. {
  736. asset.m_RendererDataList[0] = data;
  737. }
  738. else
  739. {
  740. asset.LoadBuiltinRendererData();
  741. }
  742. asset.m_RendererData = null; // Clears the old renderer
  743. }
  744. asset.k_AssetPreviousVersion = 5;
  745. }
  746. }
  747. #endif
  748. float ValidateShadowBias(float value)
  749. {
  750. return Mathf.Max(0.0f, Mathf.Min(value, UniversalRenderPipeline.maxShadowBias));
  751. }
  752. int ValidatePerObjectLights(int value)
  753. {
  754. return System.Math.Max(0, System.Math.Min(value, UniversalRenderPipeline.maxPerObjectLights));
  755. }
  756. float ValidateRenderScale(float value)
  757. {
  758. return Mathf.Max(UniversalRenderPipeline.minRenderScale, Mathf.Min(value, UniversalRenderPipeline.maxRenderScale));
  759. }
  760. /// <summary>
  761. /// Check to see if the RendererData list contains valide RendererData references.
  762. /// </summary>
  763. /// <param name="partial">This bool controls whether to test against all or any, if false then there has to be no invalid RendererData</param>
  764. /// <returns></returns>
  765. internal bool ValidateRendererDataList(bool partial = false)
  766. {
  767. var emptyEntries = 0;
  768. for (int i = 0; i < m_RendererDataList.Length; i++) emptyEntries += ValidateRendererData(i) ? 0 : 1;
  769. if (partial)
  770. return emptyEntries == 0;
  771. return emptyEntries != m_RendererDataList.Length;
  772. }
  773. internal bool ValidateRendererData(int index)
  774. {
  775. // Check to see if you are asking for the default renderer
  776. if (index == -1) index = m_DefaultRendererIndex;
  777. return index < m_RendererDataList.Length ? m_RendererDataList[index] != null : false;
  778. }
  779. }
  780. }