using System; #if UNITY_EDITOR using UnityEditor; using UnityEditor.ProjectWindowCallback; using System.IO; using UnityEditorInternal; using ShaderKeywordFilter = UnityEditor.ShaderKeywordFilter; #endif using System.ComponentModel; using System.Linq; using UnityEditor.Rendering; using UnityEngine.Serialization; using UnityEngine.Experimental.Rendering; namespace UnityEngine.Rendering.Universal { /// /// The elements in this enum define how Unity renders shadows. /// public enum ShadowQuality { /// /// Disables the shadows. /// Disabled, /// /// Shadows have hard edges. /// HardShadows, /// /// Filtering is applied when sampling shadows. Shadows have smooth edges. /// SoftShadows, } /// /// Softness quality of soft shadows. Higher means better quality, but lower performance. /// public enum SoftShadowQuality { /// /// Use this to choose the setting set on the pipeline asset. /// [InspectorName("Use settings from Render Pipeline Asset")] UsePipelineSettings, /// /// Low quality soft shadows. Recommended for mobile. 4 PCF sample filtering. /// Low, /// /// Medium quality soft shadows. The default. 5x5 tent filtering. /// Medium, /// /// High quality soft shadows. Low performance due to high sample count. 7x7 tent filtering. /// High, } /// /// This controls the size of the shadow map texture. /// public enum ShadowResolution { /// /// Use this for 256x256 shadow resolution. /// _256 = 256, /// /// Use this for 512x512 shadow resolution. /// _512 = 512, /// /// Use this for 1024x1024 shadow resolution. /// _1024 = 1024, /// /// Use this for 2048x2048 shadow resolution. /// _2048 = 2048, /// /// Use this for 4096x4096 shadow resolution. /// _4096 = 4096 } /// /// This controls the size of the Light Cookie atlas texture for additional lights (point, spot). /// public enum LightCookieResolution { /// /// Use this for 256x256 Light Cookie resolution. /// _256 = 256, /// /// Use this for 512x512 Light Cookie resolution. /// _512 = 512, /// /// Use this for 1024x1024 Light Cookie resolution. /// _1024 = 1024, /// /// Use this for 2048x2048 Light Cookie resolution. /// _2048 = 2048, /// /// Use this for 4096x4096 Light Cookie resolution. /// _4096 = 4096 } /// /// Options for selecting the format for the Light Cookie atlas texture for additional lights (point, spot). /// Low precision saves memory and bandwidth. /// public enum LightCookieFormat { /// /// Use this to select Grayscale format with low precision. /// GrayscaleLow, /// /// Use this to select Grayscale format with high precision. /// GrayscaleHigh, /// /// Use this to select Color format with low precision. /// ColorLow, /// /// Use this to select Color format with high precision. /// ColorHigh, /// /// Use this to select High Dynamic Range format. /// ColorHDR, } /// /// The default color buffer format in HDR (only). /// Affects camera rendering and postprocessing color buffers. /// public enum HDRColorBufferPrecision { /// Typically R11G11B10f for faster rendering. Recommend for mobile. /// R11G11B10f can cause a subtle blue/yellow banding in some rare cases due to lower precision of the blue component. [Tooltip("Use 32-bits per pixel for HDR rendering.")] _32Bits, /// Typically R16G16B16A16f for better quality. Can reduce banding at the cost of memory and performance. [Tooltip("Use 64-bits per pixel for HDR rendering.")] _64Bits, } /// /// Options for setting MSAA Quality. /// This defines how many samples URP computes per pixel for evaluating the effect. /// public enum MsaaQuality { /// /// Disables MSAA. /// Disabled = 1, /// /// Use this for 2 samples per pixel. /// _2x = 2, /// /// Use this for 4 samples per pixel. /// _4x = 4, /// /// Use this for 8 samples per pixel. /// _8x = 8 } /// /// Options for selecting downsampling. /// public enum Downsampling { /// /// Use this to disable downsampling. /// None, /// /// Use this to produce a half-resolution image with bilinear filtering. /// _2xBilinear, /// /// Use this to produce a quarter-resolution image with box filtering. This produces a softly blurred copy. /// _4xBox, /// /// Use this to produce a quarter-resolution image with bi-linear filtering. /// _4xBilinear } internal enum DefaultMaterialType { Standard, Particle, Terrain, Sprite, UnityBuiltinDefault, SpriteMask, Decal } /// /// Options for light rendering mode. /// public enum LightRenderingMode { /// /// Use this to disable lighting. /// Disabled = 0, /// /// Use this to select lighting to be calculated per vertex. /// PerVertex = 2, /// /// Use this to select lighting to be calculated per pixel. /// PerPixel = 1, } /// /// Defines if profiling is logged or not. This enum is not longer in use, use the Profiler instead. /// [Obsolete("PipelineDebugLevel is replaced to use the profiler and has no effect.", false)] public enum PipelineDebugLevel { /// /// Disabled logging for profiling. /// Disabled, /// /// Enabled logging for profiling. /// Profiling, } /// /// Options to select the type of Renderer to use. /// public enum RendererType { /// /// Use this for Custom Renderer. /// Custom, /// /// Use this for Universal Renderer. /// UniversalRenderer, /// /// Use this for 2D Renderer. /// _2DRenderer, /// /// This name was used before the Universal Renderer was implemented. /// [Obsolete("ForwardRenderer has been renamed (UnityUpgradable) -> UniversalRenderer", true)] ForwardRenderer = UniversalRenderer, } /// /// Options for selecting Color Grading modes, Low Dynamic Range (LDR) or High Dynamic Range (HDR) /// public enum ColorGradingMode { /// /// This mode follows a more classic workflow. Unity applies a limited range of color grading after tonemapping. /// LowDynamicRange, /// /// This mode works best for high precision grading similar to movie production workflows. Unity applies color grading before tonemapping. /// HighDynamicRange } /// /// Defines if Unity discards or stores the render targets of the DrawObjects Passes. Selecting the Store option significantly increases the memory bandwidth on mobile and tile-based GPUs. /// public enum StoreActionsOptimization { /// Unity uses the Discard option by default, and falls back to the Store option if it detects any injected Passes. Auto, /// Unity discards the render targets of render Passes that are not reused later (lower memory bandwidth). Discard, /// Unity stores all render targets of each Pass (higher memory bandwidth). Store } /// /// Defines the update frequency for the Volume Framework. /// public enum VolumeFrameworkUpdateMode { /// /// Use this to have the Volume Framework update every frame. /// [InspectorName("Every Frame")] EveryFrame = 0, /// /// Use this to disable Volume Framework updates or to update it manually via scripting. /// [InspectorName("Via Scripting")] ViaScripting = 1, /// /// Use this to choose the setting set on the pipeline asset. /// [InspectorName("Use Pipeline Settings")] UsePipelineSettings = 2, } /// /// Defines the upscaling filter selected by the user the universal render pipeline asset. /// public enum UpscalingFilterSelection { /// /// Unity selects a filtering option automatically based on the Render Scale value and the current screen resolution. /// [InspectorName("Automatic"), Tooltip("Unity selects a filtering option automatically based on the Render Scale value and the current screen resolution.")] Auto, /// /// Unity uses Bilinear filtering to perform upscaling. /// [InspectorName("Bilinear")] Linear, /// /// Unity uses Nearest-Neighbour filtering to perform upscaling. /// [InspectorName("Nearest-Neighbor")] Point, /// /// Unity uses the AMD FSR 1.0 technique to perform upscaling. /// [InspectorName("FidelityFX Super Resolution 1.0"), Tooltip("If the target device does not support Unity shader model 4.5, Unity falls back to the Automatic option.")] FSR } /// /// Type of the LOD cross-fade. /// public enum LODCrossFadeDitheringType { /// Unity uses the Bayer matrix texture to compute the LOD cross-fade dithering. BayerMatrix, /// Unity uses the precomputed blue noise texture to compute the LOD cross-fade dithering. BlueNoise } /// /// The type of Spherical Harmonics lighting evaluation in a shader. /// public enum ShEvalMode { /// Unity selects a mode automatically. Auto = 0, /// Evaluate lighting per vertex. PerVertex = 1, /// Evaluate lighting partially per vertex, partially per pixel. Mixed = 2, /// Evaluate lighting per pixel. PerPixel = 3, } /// /// The asset that contains the URP setting. /// You can use this asset as a graphics quality level. /// /// /// [ExcludeFromPreset] [URPHelpURL("universalrp-asset")] #if UNITY_EDITOR [ShaderKeywordFilter.ApplyRulesIfTagsEqual("RenderPipeline", "UniversalPipeline")] #endif public partial class UniversalRenderPipelineAsset : RenderPipelineAsset, ISerializationCallbackReceiver { Shader m_DefaultShader; ScriptableRenderer[] m_Renderers = new ScriptableRenderer[1]; // Default values set when a new UniversalRenderPipeline asset is created [SerializeField] int k_AssetVersion = 11; [SerializeField] int k_AssetPreviousVersion = 11; // Deprecated settings for upgrading sakes [SerializeField] RendererType m_RendererType = RendererType.UniversalRenderer; [EditorBrowsable(EditorBrowsableState.Never)] [Obsolete("Use m_RendererDataList instead.")] [SerializeField] internal ScriptableRendererData m_RendererData = null; // Renderer settings [SerializeField] internal ScriptableRendererData[] m_RendererDataList = new ScriptableRendererData[1]; [SerializeField] internal int m_DefaultRendererIndex = 0; // General settings [SerializeField] bool m_RequireDepthTexture = false; [SerializeField] bool m_RequireOpaqueTexture = false; [SerializeField] Downsampling m_OpaqueDownsampling = Downsampling._2xBilinear; [SerializeField] bool m_SupportsTerrainHoles = true; // Quality settings [SerializeField] bool m_SupportsHDR = true; [SerializeField] HDRColorBufferPrecision m_HDRColorBufferPrecision = HDRColorBufferPrecision._32Bits; [SerializeField] MsaaQuality m_MSAA = MsaaQuality.Disabled; [SerializeField] float m_RenderScale = 1.0f; [SerializeField] UpscalingFilterSelection m_UpscalingFilter = UpscalingFilterSelection.Auto; [SerializeField] bool m_FsrOverrideSharpness = false; [SerializeField] float m_FsrSharpness = FSRUtils.kDefaultSharpnessLinear; #if UNITY_EDITOR // multi_compile_fragment _ LOD_FADE_CROSSFADE [ShaderKeywordFilter.RemoveIf(false, keywordNames: ShaderKeywordStrings.LOD_FADE_CROSSFADE)] #endif [SerializeField] bool m_EnableLODCrossFade = true; [SerializeField] LODCrossFadeDitheringType m_LODCrossFadeDitheringType = LODCrossFadeDitheringType.BlueNoise; // ShEvalMode.Auto is handled in shader preprocessor. #if UNITY_EDITOR // multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX [ShaderKeywordFilter.RemoveIf(ShEvalMode.PerPixel, keywordNames: new [] { ShaderKeywordStrings.EVALUATE_SH_MIXED, ShaderKeywordStrings.EVALUATE_SH_VERTEX })] [ShaderKeywordFilter.SelectIf(ShEvalMode.Mixed, keywordNames: new [] { ShaderKeywordStrings.EVALUATE_SH_MIXED })] [ShaderKeywordFilter.SelectIf(ShEvalMode.PerVertex, keywordNames: new [] { ShaderKeywordStrings.EVALUATE_SH_VERTEX })] #endif [SerializeField] ShEvalMode m_ShEvalMode = ShEvalMode.Auto; // Main directional light Settings [SerializeField] LightRenderingMode m_MainLightRenderingMode = LightRenderingMode.PerPixel; [SerializeField] bool m_MainLightShadowsSupported = true; [SerializeField] ShadowResolution m_MainLightShadowmapResolution = ShadowResolution._2048; // Additional lights settings [SerializeField] LightRenderingMode m_AdditionalLightsRenderingMode = LightRenderingMode.PerPixel; [SerializeField] int m_AdditionalLightsPerObjectLimit = 4; [SerializeField] bool m_AdditionalLightShadowsSupported = false; [SerializeField] ShadowResolution m_AdditionalLightsShadowmapResolution = ShadowResolution._2048; [SerializeField] int m_AdditionalLightsShadowResolutionTierLow = AdditionalLightsDefaultShadowResolutionTierLow; [SerializeField] int m_AdditionalLightsShadowResolutionTierMedium = AdditionalLightsDefaultShadowResolutionTierMedium; [SerializeField] int m_AdditionalLightsShadowResolutionTierHigh = AdditionalLightsDefaultShadowResolutionTierHigh; // Reflection Probes #if UNITY_EDITOR // multi_compile_fragment _ _REFLECTION_PROBE_BLENDING [ShaderKeywordFilter.SelectOrRemove(true, keywordNames: ShaderKeywordStrings.ReflectionProbeBlending)] #endif [SerializeField] bool m_ReflectionProbeBlending = false; #if UNITY_EDITOR // multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION [ShaderKeywordFilter.SelectOrRemove(true, keywordNames: ShaderKeywordStrings.ReflectionProbeBoxProjection)] #endif [SerializeField] bool m_ReflectionProbeBoxProjection = false; // Shadows Settings [SerializeField] float m_ShadowDistance = 50.0f; [SerializeField] int m_ShadowCascadeCount = 1; [SerializeField] float m_Cascade2Split = 0.25f; [SerializeField] Vector2 m_Cascade3Split = new Vector2(0.1f, 0.3f); [SerializeField] Vector3 m_Cascade4Split = new Vector3(0.067f, 0.2f, 0.467f); [SerializeField] float m_CascadeBorder = 0.2f; [SerializeField] float m_ShadowDepthBias = 1.0f; [SerializeField] float m_ShadowNormalBias = 1.0f; #if UNITY_EDITOR // multi_compile_fragment _ _SHADOWS_SOFT [ShaderKeywordFilter.RemoveIf(false, keywordNames: ShaderKeywordStrings.SoftShadows)] [SerializeField] bool m_AnyShadowsSupported = true; // No option to force soft shadows -> we'll need to keep the off variant around [ShaderKeywordFilter.RemoveIf(false, keywordNames: ShaderKeywordStrings.SoftShadows)] #endif [SerializeField] bool m_SoftShadowsSupported = false; [SerializeField] bool m_ConservativeEnclosingSphere = false; [SerializeField] int m_NumIterationsEnclosingSphere = 64; [SerializeField] SoftShadowQuality m_SoftShadowQuality = SoftShadowQuality.Medium; // Light Cookie Settings [SerializeField] LightCookieResolution m_AdditionalLightsCookieResolution = LightCookieResolution._2048; [SerializeField] LightCookieFormat m_AdditionalLightsCookieFormat = LightCookieFormat.ColorHigh; // Advanced settings [SerializeField] bool m_UseSRPBatcher = true; [SerializeField] bool m_SupportsDynamicBatching = false; #if UNITY_EDITOR // multi_compile _ LIGHTMAP_SHADOW_MIXING [ShaderKeywordFilter.RemoveIf(false, keywordNames: ShaderKeywordStrings.LightmapShadowMixing)] // multi_compile _ SHADOWS_SHADOWMASK [ShaderKeywordFilter.RemoveIf(false, keywordNames: ShaderKeywordStrings.ShadowsShadowMask)] #endif [SerializeField] bool m_MixedLightingSupported = true; #if UNITY_EDITOR // multi_compile_fragment _ _LIGHT_COOKIES [ShaderKeywordFilter.RemoveIf(false, keywordNames: ShaderKeywordStrings.LightCookies)] #endif [SerializeField] bool m_SupportsLightCookies = true; #if UNITY_EDITOR // multi_compile_fragment _ _LIGHT_LAYERS [ShaderKeywordFilter.ApplyRulesIfNotGraphicsAPI(GraphicsDeviceType.OpenGLES2)] [ShaderKeywordFilter.SelectOrRemove(true, keywordNames: ShaderKeywordStrings.LightLayers)] #endif [SerializeField] bool m_SupportsLightLayers = false; [SerializeField] [Obsolete] PipelineDebugLevel m_DebugLevel; [SerializeField] StoreActionsOptimization m_StoreActionsOptimization = StoreActionsOptimization.Auto; [SerializeField] bool m_EnableRenderGraph = false; // Adaptive performance settings [SerializeField] bool m_UseAdaptivePerformance = true; // Post-processing settings [SerializeField] ColorGradingMode m_ColorGradingMode = ColorGradingMode.LowDynamicRange; [SerializeField] int m_ColorGradingLutSize = 32; #if UNITY_EDITOR // multi_compile_local_fragment _ _USE_FAST_SRGB_LINEAR_CONVERSION [ShaderKeywordFilter.SelectOrRemove(true, keywordNames: ShaderKeywordStrings.UseFastSRGBLinearConversion)] #endif [SerializeField] bool m_UseFastSRGBLinearConversion = false; // Deprecated settings [SerializeField] ShadowQuality m_ShadowType = ShadowQuality.HardShadows; [SerializeField] bool m_LocalShadowsSupported = false; [SerializeField] ShadowResolution m_LocalShadowsAtlasResolution = ShadowResolution._256; [SerializeField] int m_MaxPixelLights = 0; [SerializeField] ShadowResolution m_ShadowAtlasResolution = ShadowResolution._256; [SerializeField] VolumeFrameworkUpdateMode m_VolumeFrameworkUpdateMode = VolumeFrameworkUpdateMode.EveryFrame; [SerializeField] TextureResources m_Textures; // Note: A lut size of 16^3 is barely usable with the HDR grading mode. 32 should be the // minimum, the lut being encoded in log. Lower sizes would work better with an additional // 1D shaper lut but for now we'll keep it simple. /// /// The minimum size of the color grading LUT. /// public const int k_MinLutSize = 16; /// /// The maximum size of the color grading LUT. /// public const int k_MaxLutSize = 65; internal const int k_ShadowCascadeMinCount = 1; internal const int k_ShadowCascadeMaxCount = 4; /// /// The default value of `additionalLightsShadowResolutionTierLow`. /// public static readonly int AdditionalLightsDefaultShadowResolutionTierLow = 256; /// /// The default value of `additionalLightsShadowResolutionTierMedium`. /// public static readonly int AdditionalLightsDefaultShadowResolutionTierMedium = 512; /// /// The default value of `additionalLightsShadowResolutionTierHigh`. /// public static readonly int AdditionalLightsDefaultShadowResolutionTierHigh = 1024; #if UNITY_EDITOR [NonSerialized] internal UniversalRenderPipelineEditorResources m_EditorResourcesAsset; public static readonly string packagePath = "Packages/com.unity.render-pipelines.universal"; public static readonly string editorResourcesGUID = "a3d8d823eedde654bb4c11a1cfaf1abb"; public static UniversalRenderPipelineAsset Create(ScriptableRendererData rendererData = null) { // Create Universal RP Asset var instance = CreateInstance(); if (rendererData != null) instance.m_RendererDataList[0] = rendererData; else instance.m_RendererDataList[0] = CreateInstance(); // Initialize default Renderer instance.m_EditorResourcesAsset = instance.editorResources; // Only enable for new URP assets by default instance.m_ConservativeEnclosingSphere = true; ResourceReloader.ReloadAllNullIn(instance, packagePath); return instance; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")] internal class CreateUniversalPipelineAsset : EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { //Create asset AssetDatabase.CreateAsset(Create(CreateRendererAsset(pathName, RendererType.UniversalRenderer)), pathName); } } [MenuItem("Assets/Create/Rendering/URP Asset (with Universal Renderer)", priority = CoreUtils.Sections.section2 + CoreUtils.Priorities.assetsCreateRenderingMenuPriority + 1)] static void CreateUniversalPipeline() { ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, CreateInstance(), "New Universal Render Pipeline Asset.asset", null, null); } internal static ScriptableRendererData CreateRendererAsset(string path, RendererType type, bool relativePath = true, string suffix = "Renderer") { ScriptableRendererData data = CreateRendererData(type); string dataPath; if (relativePath) dataPath = $"{Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path))}_{suffix}{Path.GetExtension(path)}"; else dataPath = path; AssetDatabase.CreateAsset(data, dataPath); ResourceReloader.ReloadAllNullIn(data, packagePath); return data; } static ScriptableRendererData CreateRendererData(RendererType type) { switch (type) { case RendererType.UniversalRenderer: default: { var rendererData = CreateInstance(); rendererData.postProcessData = PostProcessData.GetDefaultPostProcessData(); return rendererData; } // 2D renderer is experimental case RendererType._2DRenderer: { var rendererData = CreateInstance(); rendererData.postProcessData = PostProcessData.GetDefaultPostProcessData(); return rendererData; // Universal Renderer is the fallback renderer that works on all platforms } } } // Hide: User aren't suppose to have to create it. //[MenuItem("Assets/Create/Rendering/URP Editor Resources", priority = CoreUtils.Sections.section8 + CoreUtils.Priorities.assetsCreateRenderingMenuPriority)] static void CreateUniversalPipelineEditorResources() { var instance = CreateInstance(); ResourceReloader.ReloadAllNullIn(instance, packagePath); AssetDatabase.CreateAsset(instance, string.Format("Assets/{0}.asset", typeof(UniversalRenderPipelineEditorResources).Name)); } UniversalRenderPipelineEditorResources editorResources { get { if (m_EditorResourcesAsset != null && !m_EditorResourcesAsset.Equals(null)) return m_EditorResourcesAsset; string resourcePath = AssetDatabase.GUIDToAssetPath(editorResourcesGUID); var objs = InternalEditorUtility.LoadSerializedFileAndForget(resourcePath); m_EditorResourcesAsset = objs != null && objs.Length > 0 ? objs.First() as UniversalRenderPipelineEditorResources : null; return m_EditorResourcesAsset; } } #endif /// /// Use this class to initialize the rendererData element that is required by the renderer. /// /// The RendererType of the new renderer that is initialized within this asset. /// /// public ScriptableRendererData LoadBuiltinRendererData(RendererType type = RendererType.UniversalRenderer) { #if UNITY_EDITOR EditorUtility.SetDirty(this); return m_RendererDataList[0] = CreateRendererAsset("Assets/UniversalRenderer.asset", type, false); #else m_RendererDataList[0] = null; return m_RendererDataList[0]; #endif } /// /// Creates a UniversalRenderPipeline from the UniversalRenderPipelineAsset. /// /// Returns a UniversalRenderPipeline created from this UniversalRenderPipelineAsset. /// protected override RenderPipeline CreatePipeline() { if (m_RendererDataList == null) m_RendererDataList = new ScriptableRendererData[1]; // If no default data we can't create pipeline instance if (m_RendererDataList[m_DefaultRendererIndex] == null) { // If previous version and current version are miss-matched then we are waiting for the upgrader to kick in if (k_AssetPreviousVersion != k_AssetVersion) return null; if (m_RendererDataList[m_DefaultRendererIndex].GetType().ToString() .Contains("Universal.ForwardRendererData")) return null; Debug.LogError( $"Default Renderer is missing, make sure there is a Renderer assigned as the default on the current Universal RP asset:{UniversalRenderPipeline.asset.name}", this); return null; } DestroyRenderers(); var pipeline = new UniversalRenderPipeline(this); CreateRenderers(); // Blitter can only be initialized after renderers have been created and ResourceReloader has been // called on potentially empty shader resources foreach (var data in m_RendererDataList) { if (data is UniversalRendererData universalData) { Blitter.Initialize(universalData.shaders.coreBlitPS, universalData.shaders.coreBlitColorAndDepthPS); break; } } return pipeline; } internal void DestroyRenderers() { if (m_Renderers == null) return; for (int i = 0; i < m_Renderers.Length; i++) DestroyRenderer(ref m_Renderers[i]); } void DestroyRenderer(ref ScriptableRenderer renderer) { if (renderer != null) { renderer.Dispose(); renderer = null; } } /// /// Unity calls this function when it loads the asset or when the asset is changed with the Inspector. /// protected override void OnValidate() { DestroyRenderers(); // This will call RenderPipelineManager.CleanupRenderPipeline that in turn disposes the render pipeline instance and // assign pipeline asset reference to null base.OnValidate(); } /// /// Unity calls this function when the asset is disabled. /// protected override void OnDisable() { DestroyRenderers(); // This will call RenderPipelineManager.CleanupRenderPipeline that in turn disposes the render pipeline instance and // assign pipeline asset reference to null base.OnDisable(); } void CreateRenderers() { if (m_Renderers != null) { for (int i = 0; i < m_Renderers.Length; ++i) { if (m_Renderers[i] != null) Debug.LogError($"Creating renderers but previous instance wasn't properly destroyed: m_Renderers[{i}]"); } } if (m_Renderers == null || m_Renderers.Length != m_RendererDataList.Length) m_Renderers = new ScriptableRenderer[m_RendererDataList.Length]; for (int i = 0; i < m_RendererDataList.Length; ++i) { if (m_RendererDataList[i] != null) m_Renderers[i] = m_RendererDataList[i].InternalCreateRenderer(); } } Material GetMaterial(DefaultMaterialType materialType) { #if UNITY_EDITOR if (scriptableRendererData == null || editorResources == null) return null; var material = scriptableRendererData.GetDefaultMaterial(materialType); if (material != null) return material; switch (materialType) { case DefaultMaterialType.Standard: return editorResources.materials.lit; case DefaultMaterialType.Particle: return editorResources.materials.particleLit; case DefaultMaterialType.Terrain: return editorResources.materials.terrainLit; case DefaultMaterialType.Decal: return editorResources.materials.decal; // Unity Builtin Default default: return null; } #else return null; #endif } /// /// Returns the default renderer being used by this pipeline. /// public ScriptableRenderer scriptableRenderer { get { if (m_RendererDataList?.Length > m_DefaultRendererIndex && m_RendererDataList[m_DefaultRendererIndex] == null) { Debug.LogError("Default renderer is missing from the current Pipeline Asset.", this); return null; } if (scriptableRendererData.isInvalidated || m_Renderers[m_DefaultRendererIndex] == null) { DestroyRenderer(ref m_Renderers[m_DefaultRendererIndex]); m_Renderers[m_DefaultRendererIndex] = scriptableRendererData.InternalCreateRenderer(); } return m_Renderers[m_DefaultRendererIndex]; } } /// /// Returns a renderer from the current pipeline asset /// /// Index to the renderer. If invalid index is passed, the default renderer is returned instead. /// public ScriptableRenderer GetRenderer(int index) { if (index == -1) index = m_DefaultRendererIndex; if (index >= m_RendererDataList.Length || index < 0 || m_RendererDataList[index] == null) { Debug.LogWarning( $"Renderer at index {index.ToString()} is missing, falling back to Default Renderer {m_RendererDataList[m_DefaultRendererIndex].name}", this); index = m_DefaultRendererIndex; } // RendererData list differs from RendererList. Create RendererList. if (m_Renderers == null || m_Renderers.Length < m_RendererDataList.Length) { DestroyRenderers(); CreateRenderers(); } // This renderer data is outdated or invalid, we recreate the renderer // so we construct all render passes with the updated data if (m_RendererDataList[index].isInvalidated || m_Renderers[index] == null) { DestroyRenderer(ref m_Renderers[index]); m_Renderers[index] = m_RendererDataList[index].InternalCreateRenderer(); } return m_Renderers[index]; } internal ScriptableRendererData scriptableRendererData { get { if (m_RendererDataList[m_DefaultRendererIndex] == null) CreatePipeline(); return m_RendererDataList[m_DefaultRendererIndex]; } } #if UNITY_EDITOR internal GUIContent[] rendererDisplayList { get { GUIContent[] list = new GUIContent[m_RendererDataList.Length + 1]; list[0] = new GUIContent($"Default Renderer ({RendererDataDisplayName(m_RendererDataList[m_DefaultRendererIndex])})"); for (var i = 1; i < list.Length; i++) { list[i] = new GUIContent($"{(i - 1).ToString()}: {RendererDataDisplayName(m_RendererDataList[i - 1])}"); } return list; } } string RendererDataDisplayName(ScriptableRendererData data) { if (data != null) return data.name; return "NULL (Missing RendererData)"; } #endif private static GraphicsFormat[][] s_LightCookieFormatList = new GraphicsFormat[][] { /* Grayscale Low */ new GraphicsFormat[] {GraphicsFormat.R8_UNorm}, /* Grayscale High*/ new GraphicsFormat[] {GraphicsFormat.R16_UNorm}, /* Color Low */ new GraphicsFormat[] {GraphicsFormat.R5G6B5_UNormPack16, GraphicsFormat.B5G6R5_UNormPack16, GraphicsFormat.R5G5B5A1_UNormPack16, GraphicsFormat.B5G5R5A1_UNormPack16}, /* Color High */ new GraphicsFormat[] {GraphicsFormat.A2B10G10R10_UNormPack32, GraphicsFormat.R8G8B8A8_SRGB, GraphicsFormat.B8G8R8A8_SRGB}, /* Color HDR */ new GraphicsFormat[] {GraphicsFormat.B10G11R11_UFloatPack32}, }; internal GraphicsFormat additionalLightsCookieFormat { get { GraphicsFormat result = GraphicsFormat.None; foreach (var format in s_LightCookieFormatList[(int)m_AdditionalLightsCookieFormat]) { if (SystemInfo.IsFormatSupported(format, FormatUsage.Render)) { result = format; break; } } if (QualitySettings.activeColorSpace == ColorSpace.Gamma) result = GraphicsFormatUtility.GetLinearFormat(result); // Fallback if (result == GraphicsFormat.None) { result = GraphicsFormat.R8G8B8A8_UNorm; Debug.LogWarning($"Additional Lights Cookie Format ({ m_AdditionalLightsCookieFormat.ToString() }) is not supported by the platform. Falling back to {GraphicsFormatUtility.GetBlockSize(result) * 8}-bit format ({GraphicsFormatUtility.GetFormatString(result)})"); } return result; } } internal Vector2Int additionalLightsCookieResolution => new Vector2Int((int)m_AdditionalLightsCookieResolution, (int)m_AdditionalLightsCookieResolution); internal int[] rendererIndexList { get { int[] list = new int[m_RendererDataList.Length + 1]; for (int i = 0; i < list.Length; i++) { list[i] = i - 1; } return list; } } /// /// When true, the pipeline creates a depth texture that can be read in shaders. The depth texture can be accessed as _CameraDepthTexture. This setting can be overridden per camera. /// public bool supportsCameraDepthTexture { get { return m_RequireDepthTexture; } set { m_RequireDepthTexture = value; } } /// /// When true, the pipeline creates a texture that contains a copy of the color buffer after rendering opaque objects. This texture can be accessed in shaders as _CameraOpaqueTexture. This setting can be overridden per camera. /// public bool supportsCameraOpaqueTexture { get { return m_RequireOpaqueTexture; } set { m_RequireOpaqueTexture = value; } } /// /// Returns the downsampling method used when copying the camera color texture after rendering opaques. /// public Downsampling opaqueDownsampling { get { return m_OpaqueDownsampling; } } /// /// This settings controls if the asset UniversalRenderPipelineAsset supports terrain holes. /// /// public bool supportsTerrainHoles { get { return m_SupportsTerrainHoles; } } /// /// Returns the active store action optimization value. /// /// Returns the active store action optimization value. public StoreActionsOptimization storeActionsOptimization { get { return m_StoreActionsOptimization; } set { m_StoreActionsOptimization = value; } } /// /// When enabled, the camera renders to HDR buffers. This setting can be overridden per camera. /// /// public bool supportsHDR { get { return m_SupportsHDR; } set { m_SupportsHDR = value; } } /// /// Graphics format requested for HDR color buffers. /// public HDRColorBufferPrecision hdrColorBufferPrecision { get { return m_HDRColorBufferPrecision; } set { m_HDRColorBufferPrecision = value; } } /// /// Specifies the msaa sample count used by this UniversalRenderPipelineAsset /// /// public int msaaSampleCount { get { return (int)m_MSAA; } set { m_MSAA = (MsaaQuality)value; } } /// /// Specifies the render scale which scales the render target resolution used by this UniversalRenderPipelineAsset. /// public float renderScale { get { return m_RenderScale; } set { m_RenderScale = ValidateRenderScale(value); } } /// /// Returns true if the cross-fade style blending between the current LOD and the next LOD is enabled. /// public bool enableLODCrossFade { get { return m_EnableLODCrossFade; } } /// /// Returns the type of active LOD cross-fade. /// public LODCrossFadeDitheringType lodCrossFadeDitheringType { get { return m_LODCrossFadeDitheringType; } } /// /// Returns the upscaling filter desired by the user /// Note: Filter selections differ from actual filters in that they may include "meta-filters" such as /// "Automatic" which resolve to an actual filter at a later time. /// public UpscalingFilterSelection upscalingFilter { get { return m_UpscalingFilter; } set { m_UpscalingFilter = value; } } /// /// If this property is set to true, the value from the fsrSharpness property will control the intensity of the /// sharpening filter associated with FidelityFX Super Resolution. /// public bool fsrOverrideSharpness { get { return m_FsrOverrideSharpness; } set { m_FsrOverrideSharpness = value; } } /// /// Controls the intensity of the sharpening filter associated with FidelityFX Super Resolution. /// A value of 1.0 produces maximum sharpness while a value of 0.0 disables the sharpening filter entirely. /// /// Note: This value only has an effect when the fsrOverrideSharpness property is set to true. /// public float fsrSharpness { get { return m_FsrSharpness; } set { m_FsrSharpness = value; } } /// /// Defines the type of Spherical Harmonic (SH) evaluation in lighting. /// public ShEvalMode shEvalMode { get { return m_ShEvalMode; } internal set { m_ShEvalMode = value; } } /// /// Specifies the LightRenderingMode for the main light used by this UniversalRenderPipelineAsset. /// /// public LightRenderingMode mainLightRenderingMode { get { return m_MainLightRenderingMode; } internal set { m_MainLightRenderingMode = value; } } /// /// Specifies if objects lit by main light cast shadows. /// public bool supportsMainLightShadows { get { return m_MainLightShadowsSupported; } internal set { m_MainLightShadowsSupported = value; #if UNITY_EDITOR m_AnyShadowsSupported = m_MainLightShadowsSupported || m_AdditionalLightShadowsSupported; #endif } } /// /// Returns the main light shadowmap resolution used for this UniversalRenderPipelineAsset. /// public int mainLightShadowmapResolution { get { return (int)m_MainLightShadowmapResolution; } internal set { m_MainLightShadowmapResolution = (ShadowResolution)value; } } /// /// Specifies the LightRenderingMode for the additional lights used by this UniversalRenderPipelineAsset. /// /// public LightRenderingMode additionalLightsRenderingMode { get { return m_AdditionalLightsRenderingMode; } internal set { m_AdditionalLightsRenderingMode = value; } } /// /// Specifies the maximum amount of per-object additional lights which can be used by this UniversalRenderPipelineAsset. /// public int maxAdditionalLightsCount { get { return m_AdditionalLightsPerObjectLimit; } set { m_AdditionalLightsPerObjectLimit = ValidatePerObjectLights(value); } } /// /// Specifies if objects lit by additional lights cast shadows. /// public bool supportsAdditionalLightShadows { get { return m_AdditionalLightShadowsSupported; } internal set { m_AdditionalLightShadowsSupported = value; #if UNITY_EDITOR m_AnyShadowsSupported = m_MainLightShadowsSupported || m_AdditionalLightShadowsSupported; #endif } } /// /// Additional light shadows are rendered into a single shadow map atlas texture. This setting controls the resolution of the shadow map atlas texture. /// public int additionalLightsShadowmapResolution { get { return (int)m_AdditionalLightsShadowmapResolution; } internal set { m_AdditionalLightsShadowmapResolution = (ShadowResolution)value; } } /// /// Returns the additional light shadow resolution defined for tier "Low" in the UniversalRenderPipeline asset. /// public int additionalLightsShadowResolutionTierLow { get { return (int)m_AdditionalLightsShadowResolutionTierLow; } internal set { m_AdditionalLightsShadowResolutionTierLow = value; } } /// /// Returns the additional light shadow resolution defined for tier "Medium" in the UniversalRenderPipeline asset. /// public int additionalLightsShadowResolutionTierMedium { get { return (int)m_AdditionalLightsShadowResolutionTierMedium; } internal set { m_AdditionalLightsShadowResolutionTierMedium = value; } } /// /// Returns the additional light shadow resolution defined for tier "High" in the UniversalRenderPipeline asset. /// public int additionalLightsShadowResolutionTierHigh { get { return (int)m_AdditionalLightsShadowResolutionTierHigh; } internal set { m_AdditionalLightsShadowResolutionTierHigh = value; } } internal int GetAdditionalLightsShadowResolution(int additionalLightsShadowResolutionTier) { if (additionalLightsShadowResolutionTier <= UniversalAdditionalLightData.AdditionalLightsShadowResolutionTierLow /* 0 */) return additionalLightsShadowResolutionTierLow; if (additionalLightsShadowResolutionTier == UniversalAdditionalLightData.AdditionalLightsShadowResolutionTierMedium /* 1 */) return additionalLightsShadowResolutionTierMedium; if (additionalLightsShadowResolutionTier >= UniversalAdditionalLightData.AdditionalLightsShadowResolutionTierHigh /* 2 */) return additionalLightsShadowResolutionTierHigh; return additionalLightsShadowResolutionTierMedium; } /// /// Specifies if this UniversalRenderPipelineAsset should use Probe blending for the reflection probes in the scene. /// public bool reflectionProbeBlending { get { return m_ReflectionProbeBlending; } internal set { m_ReflectionProbeBlending = value; } } /// /// Specifies if this UniversalRenderPipelineAsset should allow box projection for the reflection probes in the scene. /// public bool reflectionProbeBoxProjection { get { return m_ReflectionProbeBoxProjection; } internal set { m_ReflectionProbeBoxProjection = value; } } /// /// Controls the maximum distance at which shadows are visible. /// public float shadowDistance { get { return m_ShadowDistance; } set { m_ShadowDistance = Mathf.Max(0.0f, value); } } /// /// Returns the number of shadow cascades. /// public int shadowCascadeCount { get { return m_ShadowCascadeCount; } set { if (value < k_ShadowCascadeMinCount || value > k_ShadowCascadeMaxCount) { throw new ArgumentException($"Value ({value}) needs to be between {k_ShadowCascadeMinCount} and {k_ShadowCascadeMaxCount}."); } m_ShadowCascadeCount = value; } } /// /// Returns the split value. /// /// Returns a Float with the split value. public float cascade2Split { get { return m_Cascade2Split; } internal set { m_Cascade2Split = value; } } /// /// Returns the split values. /// /// Returns a Vector2 with the split values. public Vector2 cascade3Split { get { return m_Cascade3Split; } internal set { m_Cascade3Split = value; } } /// /// Returns the split values. /// /// Returns a Vector3 with the split values. public Vector3 cascade4Split { get { return m_Cascade4Split; } internal set { m_Cascade4Split = value; } } /// /// Last cascade fade distance in percentage. /// public float cascadeBorder { get { return m_CascadeBorder; } set { m_CascadeBorder = value; } } /// /// The Shadow Depth Bias, controls the offset of the lit pixels. /// public float shadowDepthBias { get { return m_ShadowDepthBias; } set { m_ShadowDepthBias = ValidateShadowBias(value); } } /// /// Controls the distance at which the shadow casting surfaces are shrunk along the surface normal. /// public float shadowNormalBias { get { return m_ShadowNormalBias; } set { m_ShadowNormalBias = ValidateShadowBias(value); } } /// /// Supports Soft Shadows controls the Soft Shadows. /// public bool supportsSoftShadows { get { return m_SoftShadowsSupported; } internal set { m_SoftShadowsSupported = value; } } /// /// Light default Soft Shadow Quality. /// internal SoftShadowQuality softShadowQuality { get { return m_SoftShadowQuality; } set { m_SoftShadowQuality = value; } } /// /// Specifies if this UniversalRenderPipelineAsset should use dynamic batching. /// /// public bool supportsDynamicBatching { get { return m_SupportsDynamicBatching; } set { m_SupportsDynamicBatching = value; } } /// /// Returns true if the Render Pipeline Asset supports mixed lighting, false otherwise. /// /// public bool supportsMixedLighting { get { return m_MixedLightingSupported; } } /// /// Returns true if the Render Pipeline Asset supports light cookies, false otherwise. /// public bool supportsLightCookies { get { return m_SupportsLightCookies; } } /// /// Returns true if the Render Pipeline Asset supports light layers, false otherwise. /// [Obsolete("This is obsolete, UnityEngine.Rendering.ShaderVariantLogLevel instead.", false)] public bool supportsLightLayers { get { return m_SupportsLightLayers; } } /// /// Returns true if the Render Pipeline Asset supports rendering layers for lights, false otherwise. /// public bool useRenderingLayers { get { return m_SupportsLightLayers; } } /// /// Returns the selected update mode for volumes. /// public VolumeFrameworkUpdateMode volumeFrameworkUpdateMode => m_VolumeFrameworkUpdateMode; /// /// Previously returned the debug level for this Render Pipeline Asset but is now deprecated. Replaced to use the profiler and is no longer used. /// [Obsolete("PipelineDebugLevel is deprecated and replaced to use the profiler. Calling debugLevel is not necessary.", false)] public PipelineDebugLevel debugLevel { get => PipelineDebugLevel.Disabled; } /// /// Specifies if SRPBacher is used by this UniversalRenderPipelineAsset. /// /// public bool useSRPBatcher { get { return m_UseSRPBatcher; } set { m_UseSRPBatcher = value; } } /// /// Controls whether the RenderGraph render path is enabled. /// internal bool enableRenderGraph { get { return m_EnableRenderGraph; } set { m_EnableRenderGraph = value; } } /// /// Returns the selected ColorGradingMode in the URP Asset. /// /// public ColorGradingMode colorGradingMode { get { return m_ColorGradingMode; } set { m_ColorGradingMode = value; } } /// /// Specifies the color grading LUT (lookup table) size in the URP Asset. /// public int colorGradingLutSize { get { return m_ColorGradingLutSize; } set { m_ColorGradingLutSize = Mathf.Clamp(value, k_MinLutSize, k_MaxLutSize); } } /// /// Returns true if fast approximation functions are used when converting between the sRGB and Linear color spaces, false otherwise. /// public bool useFastSRGBLinearConversion { get { return m_UseFastSRGBLinearConversion; } } /// /// Set to true to allow Adaptive performance to modify graphics quality settings during runtime. /// Only applicable when Adaptive performance package is available. /// public bool useAdaptivePerformance { get { return m_UseAdaptivePerformance; } set { m_UseAdaptivePerformance = value; } } /// /// Set to true to enable a conservative method for calculating the size and position of the minimal enclosing sphere around the frustum cascade corner points for shadow culling. /// public bool conservativeEnclosingSphere { get { return m_ConservativeEnclosingSphere; } set { m_ConservativeEnclosingSphere = value; } } /// /// Set the number of iterations to reduce the cascade culling enlcosing sphere to be closer to the absolute minimun enclosing sphere, but will also require more CPU computation for increasing values. /// This parameter is used only when conservativeEnclosingSphere is set to true. Default value is 64. /// public int numIterationsEnclosingSphere { get { return m_NumIterationsEnclosingSphere; } set { m_NumIterationsEnclosingSphere = value; } } /// /// Returns the default Material. /// /// Returns the default Material. public override Material defaultMaterial { get { return GetMaterial(DefaultMaterialType.Standard); } } /// /// Returns the default particle Material. /// /// Returns the default particle Material. public override Material defaultParticleMaterial { get { return GetMaterial(DefaultMaterialType.Particle); } } /// /// Returns the default line Material. /// /// Returns the default line Material. public override Material defaultLineMaterial { get { return GetMaterial(DefaultMaterialType.Particle); } } /// /// Returns the default terrain Material. /// /// Returns the default terrain Material. public override Material defaultTerrainMaterial { get { return GetMaterial(DefaultMaterialType.Terrain); } } /// /// Returns the default UI Material. /// /// Returns the default UI Material. public override Material defaultUIMaterial { get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); } } /// /// Returns the default UI overdraw Material. /// /// Returns the default UI overdraw Material. public override Material defaultUIOverdrawMaterial { get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); } } /// /// Returns the default UIETC1 supported Material for this asset. /// /// Returns the default UIETC1 supported Material. public override Material defaultUIETC1SupportedMaterial { get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); } } /// /// Returns the default material for the 2D renderer. /// /// Returns the material containing the default lit and unlit shader passes for sprites in the 2D renderer. public override Material default2DMaterial { get { return GetMaterial(DefaultMaterialType.Sprite); } } /// /// Returns the default sprite mask material for the 2D renderer. /// /// Returns the material containing the default shader pass for sprite mask in the 2D renderer. public override Material default2DMaskMaterial { get { return GetMaterial(DefaultMaterialType.SpriteMask); } } /// /// Returns the Material that Unity uses to render decals. /// /// Returns the Material containing the Unity decal shader. public Material decalMaterial { get { return GetMaterial(DefaultMaterialType.Decal); } } /// /// Returns the default shader for the specified renderer. When creating new objects in the editor, the materials of those objects will use the selected default shader. /// /// Returns the default shader for the specified renderer. public override Shader defaultShader { get { #if UNITY_EDITOR // TODO: When importing project, AssetPreviewUpdater:CreatePreviewForAsset will be called multiple time // which in turns calls this property to get the default shader. // The property should never return null as, when null, it loads the data using AssetDatabase.LoadAssetAtPath. // However it seems there's an issue that LoadAssetAtPath will not load the asset in some cases. so adding the null check // here to fix template tests. if (scriptableRendererData != null) { Shader defaultShader = scriptableRendererData.GetDefaultShader(); if (defaultShader != null) return defaultShader; } if (m_DefaultShader == null) { string path = AssetDatabase.GUIDToAssetPath(ShaderUtils.GetShaderGUID(ShaderPathID.Lit)); m_DefaultShader = AssetDatabase.LoadAssetAtPath(path); } #endif if (m_DefaultShader == null) m_DefaultShader = Shader.Find(ShaderUtils.GetShaderPath(ShaderPathID.Lit)); return m_DefaultShader; } } #if UNITY_EDITOR /// /// Returns the Autodesk Interactive shader that this asset uses. /// /// Returns the Autodesk Interactive shader that this asset uses. public override Shader autodeskInteractiveShader { get { return editorResources?.shaders.autodeskInteractivePS; } } /// /// Returns the Autodesk Interactive transparent shader that this asset uses. /// /// Returns the Autodesk Interactive transparent shader that this asset uses. public override Shader autodeskInteractiveTransparentShader { get { return editorResources?.shaders.autodeskInteractiveTransparentPS; } } /// /// Returns the Autodesk Interactive mask shader that this asset uses. /// /// Returns the Autodesk Interactive mask shader that this asset uses public override Shader autodeskInteractiveMaskedShader { get { return editorResources?.shaders.autodeskInteractiveMaskedPS; } } /// /// Returns the terrain detail lit shader that this asset uses. /// /// Returns the terrain detail lit shader that this asset uses. public override Shader terrainDetailLitShader { get { return editorResources?.shaders.terrainDetailLitPS; } } /// /// Returns the terrain detail grass shader that this asset uses. /// /// Returns the terrain detail grass shader that this asset uses. public override Shader terrainDetailGrassShader { get { return editorResources?.shaders.terrainDetailGrassPS; } } /// /// Returns the terrain detail grass billboard shader that this asset uses. /// /// Returns the terrain detail grass billboard shader that this asset uses. public override Shader terrainDetailGrassBillboardShader { get { return editorResources?.shaders.terrainDetailGrassBillboardPS; } } /// /// Returns the default SpeedTree7 shader that this asset uses. /// /// Returns the default SpeedTree7 shader that this asset uses. public override Shader defaultSpeedTree7Shader { get { return editorResources?.shaders.defaultSpeedTree7PS; } } /// /// Returns the default SpeedTree8 shader that this asset uses. /// /// Returns the default SpeedTree8 shader that this asset uses. public override Shader defaultSpeedTree8Shader { get { return editorResources?.shaders.defaultSpeedTree8PS; } } /// public override string renderPipelineShaderTag => UniversalRenderPipeline.k_ShaderTagName; #endif /// Names used for display of rendering layer masks. public override string[] renderingLayerMaskNames => UniversalRenderPipelineGlobalSettings.instance.renderingLayerMaskNames; /// Names used for display of rendering layer masks with prefix. public override string[] prefixedRenderingLayerMaskNames => UniversalRenderPipelineGlobalSettings.instance.prefixedRenderingLayerMaskNames; /// /// Names used for display of light layers. /// [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)] public string[] lightLayerMaskNames => new string[0]; /// /// Returns asset texture resources /// public TextureResources textures { get { if (m_Textures == null) m_Textures = new TextureResources(); #if UNITY_EDITOR if (m_Textures.NeedsReload()) ResourceReloader.ReloadAllNullIn(this, packagePath); #endif return m_Textures; } } /// /// Unity raises a callback to this method before it serializes the asset. /// public void OnBeforeSerialize() { } /// /// Unity raises a callback to this method after it deserializes the asset. /// public void OnAfterDeserialize() { if (k_AssetVersion < 3) { m_SoftShadowsSupported = (m_ShadowType == ShadowQuality.SoftShadows); k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 3; } if (k_AssetVersion < 4) { m_AdditionalLightShadowsSupported = m_LocalShadowsSupported; m_AdditionalLightsShadowmapResolution = m_LocalShadowsAtlasResolution; m_AdditionalLightsPerObjectLimit = m_MaxPixelLights; m_MainLightShadowmapResolution = m_ShadowAtlasResolution; k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 4; } if (k_AssetVersion < 5) { if (m_RendererType == RendererType.Custom) { #pragma warning disable 618 // Obsolete warning m_RendererDataList[0] = m_RendererData; #pragma warning restore 618 // Obsolete warning } k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 5; } if (k_AssetVersion < 6) { #pragma warning disable 618 // Obsolete warning // Adding an upgrade here so that if it was previously set to 2 it meant 4 cascades. // So adding a 3rd cascade shifted this value up 1. int value = (int)m_ShadowCascades; if (value == 2) { m_ShadowCascadeCount = 4; } else { m_ShadowCascadeCount = value + 1; } k_AssetVersion = 6; #pragma warning restore 618 // Obsolete warning } if (k_AssetVersion < 7) { k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 7; } if (k_AssetVersion < 8) { k_AssetPreviousVersion = k_AssetVersion; m_CascadeBorder = 0.1f; // In previous version we had this hard coded k_AssetVersion = 8; } if (k_AssetVersion < 9) { bool assetContainsCustomAdditionalLightShadowResolutions = m_AdditionalLightsShadowResolutionTierHigh != AdditionalLightsDefaultShadowResolutionTierHigh || m_AdditionalLightsShadowResolutionTierMedium != AdditionalLightsDefaultShadowResolutionTierMedium || m_AdditionalLightsShadowResolutionTierLow != AdditionalLightsDefaultShadowResolutionTierLow; if (!assetContainsCustomAdditionalLightShadowResolutions) { // if all resolutions are still the default values, we assume that they have never been customized and that it is safe to upgrade them to fit better the Additional Lights Shadow Atlas size m_AdditionalLightsShadowResolutionTierHigh = (int)m_AdditionalLightsShadowmapResolution; m_AdditionalLightsShadowResolutionTierMedium = Mathf.Max(m_AdditionalLightsShadowResolutionTierHigh / 2, UniversalAdditionalLightData.AdditionalLightsShadowMinimumResolution); m_AdditionalLightsShadowResolutionTierLow = Mathf.Max(m_AdditionalLightsShadowResolutionTierMedium / 2, UniversalAdditionalLightData.AdditionalLightsShadowMinimumResolution); } k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 9; } if (k_AssetVersion < 10) { k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 10; } if (k_AssetVersion < 11) { k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 11; } #if UNITY_EDITOR if (k_AssetPreviousVersion != k_AssetVersion) { EditorApplication.delayCall += () => UpgradeAsset(this.GetInstanceID()); } #endif } #if UNITY_EDITOR static void UpgradeAsset(int assetInstanceID) { UniversalRenderPipelineAsset asset = EditorUtility.InstanceIDToObject(assetInstanceID) as UniversalRenderPipelineAsset; if (asset.k_AssetPreviousVersion < 5) { if (asset.m_RendererType == RendererType.UniversalRenderer) { var data = AssetDatabase.LoadAssetAtPath("Assets/UniversalRenderer.asset"); if (data) { asset.m_RendererDataList[0] = data; } else { asset.LoadBuiltinRendererData(); } #pragma warning disable 618 // Obsolete warning asset.m_RendererData = null; // Clears the old renderer #pragma warning restore 618 // Obsolete warning } asset.k_AssetPreviousVersion = 5; } if (asset.k_AssetPreviousVersion < 9) { // The added feature was reverted, we keep this version to avoid breakage in case somebody already has version 7 asset.k_AssetPreviousVersion = 9; } if (asset.k_AssetPreviousVersion < 10) { UniversalRenderPipelineGlobalSettings.Ensure().shaderVariantLogLevel = (Rendering.ShaderVariantLogLevel) asset.m_ShaderVariantLogLevel; asset.k_AssetPreviousVersion = 10; } if(asset.k_AssetPreviousVersion < 11) { ResourceReloader.ReloadAllNullIn(asset, packagePath); asset.k_AssetPreviousVersion = 11; } EditorUtility.SetDirty(asset); } #endif float ValidateShadowBias(float value) { return Mathf.Max(0.0f, Mathf.Min(value, UniversalRenderPipeline.maxShadowBias)); } int ValidatePerObjectLights(int value) { return System.Math.Max(0, System.Math.Min(value, UniversalRenderPipeline.maxPerObjectLights)); } float ValidateRenderScale(float value) { return Mathf.Max(UniversalRenderPipeline.minRenderScale, Mathf.Min(value, UniversalRenderPipeline.maxRenderScale)); } /// /// Check to see if the RendererData list contains valid RendererData references. /// /// This bool controls whether to test against all or any, if false then there has to be no invalid RendererData /// internal bool ValidateRendererDataList(bool partial = false) { var emptyEntries = 0; for (int i = 0; i < m_RendererDataList.Length; i++) emptyEntries += ValidateRendererData(i) ? 0 : 1; if (partial) return emptyEntries == 0; return emptyEntries != m_RendererDataList.Length; } internal bool ValidateRendererData(int index) { // Check to see if you are asking for the default renderer if (index == -1) index = m_DefaultRendererIndex; return index < m_RendererDataList.Length ? m_RendererDataList[index] != null : false; } /// /// Class containing texture resources used in URP. /// [Serializable, ReloadGroup] public sealed class TextureResources { /// /// Pre-baked blue noise textures. /// [Reload("Textures/BlueNoise64/L/LDR_LLL1_0.png")] public Texture2D blueNoise64LTex; /// /// Bayer matrix texture. /// [Reload("Textures/BayerMatrix.png")] public Texture2D bayerMatrixTex; /// /// Check if the textures need reloading. /// /// True if any of the textures need reloading. public bool NeedsReload() { return blueNoise64LTex == null || bayerMatrixTex == null; } } } }