暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

EditorTests.cs 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using NUnit.Framework;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using UnityEngine.Rendering;
  5. using UnityEngine.Profiling;
  6. using UnityEngine.Rendering.Universal;
  7. using UnityEditor.Rendering.Universal.Internal;
  8. using UnityEngine.Experimental.Rendering;
  9. using UnityEngine.Experimental.Rendering.Universal;
  10. using UnityEngine.TestTools;
  11. class EditorTests
  12. {
  13. // Validate that resource Guids are valid
  14. [Test]
  15. public void ValidateBuiltinResourceFiles()
  16. {
  17. string templatePath = AssetDatabase.GUIDToAssetPath(ResourceGuid.rendererTemplate);
  18. Assert.IsFalse(string.IsNullOrEmpty(templatePath));
  19. }
  20. // Validate that ShaderUtils.GetShaderGUID results are valid and that ShaderUtils.GetShaderPath match shader names.
  21. [TestCase(ShaderPathID.Lit)]
  22. [TestCase(ShaderPathID.SimpleLit)]
  23. [TestCase(ShaderPathID.Unlit)]
  24. [TestCase(ShaderPathID.TerrainLit)]
  25. [TestCase(ShaderPathID.ParticlesLit)]
  26. [TestCase(ShaderPathID.ParticlesSimpleLit)]
  27. [TestCase(ShaderPathID.ParticlesUnlit)]
  28. [TestCase(ShaderPathID.BakedLit)]
  29. [TestCase(ShaderPathID.SpeedTree7)]
  30. [TestCase(ShaderPathID.SpeedTree7Billboard)]
  31. [TestCase(ShaderPathID.SpeedTree8)]
  32. public void ValidateShaderResources(ShaderPathID shaderPathID)
  33. {
  34. string path = AssetDatabase.GUIDToAssetPath(ShaderUtils.GetShaderGUID(shaderPathID));
  35. Assert.IsFalse(string.IsNullOrEmpty(path));
  36. var shader = AssetDatabase.LoadAssetAtPath<Shader>(path);
  37. Assert.AreEqual(shader.name, ShaderUtils.GetShaderPath(shaderPathID));
  38. var propertyNames = new System.Collections.Generic.HashSet<string>();
  39. for (int j = 0; j < shader.GetPropertyCount(); ++j)
  40. {
  41. string propertyName = shader.GetPropertyName(j);
  42. Assert.IsFalse(propertyNames.Contains(propertyName), $"{shader.name} has duplicated property {propertyName}!");
  43. propertyNames.Add(propertyName);
  44. }
  45. }
  46. // When creating URP all required resources should be initialized.
  47. [Test]
  48. public void ValidateNewAssetResources()
  49. {
  50. if (GraphicsSettings.currentRenderPipeline is not UniversalRenderPipelineAsset)
  51. {
  52. Assert.Ignore("This test is only available when URP is the current pipeline.");
  53. return;
  54. }
  55. UniversalRendererData data = ScriptableObject.CreateInstance<UniversalRendererData>();
  56. UniversalRenderPipelineAsset asset = UniversalRenderPipelineAsset.Create(data);
  57. UniversalRenderPipelineGlobalSettings.Ensure();
  58. Assert.AreNotEqual(null, asset.defaultMaterial);
  59. Assert.AreNotEqual(null, asset.defaultParticleMaterial);
  60. Assert.AreNotEqual(null, asset.defaultLineMaterial);
  61. Assert.AreNotEqual(null, asset.defaultTerrainMaterial);
  62. Assert.AreNotEqual(null, asset.defaultShader);
  63. // URP doesn't override the following materials
  64. Assert.AreEqual(null, asset.defaultUIMaterial);
  65. Assert.AreEqual(null, asset.defaultUIOverdrawMaterial);
  66. Assert.AreEqual(null, asset.defaultUIETC1SupportedMaterial);
  67. Assert.AreEqual(null, asset.default2DMaterial);
  68. Assert.AreEqual(null, asset.default2DMaskMaterial);
  69. Assert.AreNotEqual(null, asset.m_RendererDataList, "A default renderer data should be created when creating a new pipeline.");
  70. ScriptableObject.DestroyImmediate(asset);
  71. ScriptableObject.DestroyImmediate(data);
  72. }
  73. // When changing URP settings, all settings should be valid.
  74. [Test]
  75. public void ValidateAssetSettings()
  76. {
  77. // Create a new asset and validate invalid settings
  78. UniversalRendererData data = ScriptableObject.CreateInstance<UniversalRendererData>();
  79. UniversalRenderPipelineAsset asset = UniversalRenderPipelineAsset.Create(data);
  80. if (asset != null)
  81. {
  82. asset.shadowDistance = -1.0f;
  83. Assert.GreaterOrEqual(asset.shadowDistance, 0.0f);
  84. asset.renderScale = -1.0f;
  85. Assert.GreaterOrEqual(asset.renderScale, UniversalRenderPipeline.minRenderScale);
  86. asset.renderScale = 32.0f;
  87. Assert.LessOrEqual(asset.renderScale, UniversalRenderPipeline.maxRenderScale);
  88. asset.shadowNormalBias = -1.0f;
  89. Assert.GreaterOrEqual(asset.shadowNormalBias, 0.0f);
  90. asset.shadowNormalBias = 32.0f;
  91. Assert.LessOrEqual(asset.shadowNormalBias, UniversalRenderPipeline.maxShadowBias);
  92. asset.shadowDepthBias = -1.0f;
  93. Assert.GreaterOrEqual(asset.shadowDepthBias, 0.0f);
  94. asset.shadowDepthBias = 32.0f;
  95. Assert.LessOrEqual(asset.shadowDepthBias, UniversalRenderPipeline.maxShadowBias);
  96. asset.maxAdditionalLightsCount = -1;
  97. Assert.GreaterOrEqual(asset.maxAdditionalLightsCount, 0);
  98. asset.maxAdditionalLightsCount = 32;
  99. Assert.LessOrEqual(asset.maxAdditionalLightsCount, UniversalRenderPipeline.maxPerObjectLights);
  100. }
  101. ScriptableObject.DestroyImmediate(asset);
  102. ScriptableObject.DestroyImmediate(data);
  103. }
  104. // When working with SpeedTree v7 assets, UniversalSpeedTree8Upgrader should not throw exception
  105. [Test]
  106. public void UniversalSpeedTree8Upgrader_ShouldntThrowExceptionWhenImportingSpeedTree7Assets()
  107. {
  108. const string STv7AssetName = "EuropeanBeech_Desktop.spm";
  109. const string STv7AssetPath = "Assets/CommonAssets/SpeedTree/SpeedTreeV7/EU_Beech/" + STv7AssetName;
  110. // Ensure this is not thrown:
  111. // NullReferenceException: Object reference not set to an instance of an object
  112. // UnityEditor.Rendering.SpeedTree8MaterialUpgrader.GetWindQuality
  113. // UnityEditor.Rendering.SpeedTree8MaterialUpgrader.UpgradeWindQuality
  114. // UnityEditor.Rendering.SpeedTree8MaterialUpgrader.SpeedTree8MaterialFinalizer
  115. // UnityEditor.Rendering.Universal.UniversalSpeedTree8Upgrader.UniversalSpeedTree8MaterialFinalizer
  116. Assert.DoesNotThrow(() => AssetDatabase.ImportAsset(STv7AssetPath));
  117. }
  118. [Test]
  119. public void UseReAllocateIfNeededWithoutTextureLeak()
  120. {
  121. Object[] pretestTextures = Resources.FindObjectsOfTypeAll(typeof(Texture));
  122. RTHandle myHandle = default(RTHandle);
  123. // URP is not initlized in test framework, init RTHandlePool here which is required for this test.
  124. if (UniversalRenderPipeline.s_RTHandlePool == null)
  125. {
  126. UniversalRenderPipeline.s_RTHandlePool = new RTHandleResourcePool();
  127. }
  128. // Realloc RTHandle 100 times with different resolution.
  129. for (int i = 0; i < 100; i++)
  130. {
  131. RenderTextureDescriptor rtd = new RenderTextureDescriptor(1, 1 + i, GraphicsFormat.R8G8B8A8_UNorm, GraphicsFormat.None);
  132. RenderingUtils.ReAllocateHandleIfNeeded(ref myHandle, rtd, FilterMode.Point, TextureWrapMode.Clamp);
  133. }
  134. UniversalRenderPipeline.s_RTHandlePool.Cleanup();
  135. RTHandles.Release(myHandle);
  136. Object[] posttestTextures = Resources.FindObjectsOfTypeAll(typeof(Texture));
  137. Assert.AreEqual(pretestTextures.Length, posttestTextures.Length, "A texture leak is detected when using RenderingUtils.ReAllocateIfNeeded.");
  138. }
  139. }