using System; namespace UnityEngine.Rendering.Universal { /// /// A resource container for shaders used for . /// /// /// You cannot edit these resources through the editor's UI; use the API for advanced changes. /// Changing this through the API is only allowed in the Editor. In the Player, this raises an error. /// /// /// /// Here is an example of how to get the blit shader used by URP. /// /// using UnityEngine.Rendering; /// using UnityEngine.Rendering.Universal; /// /// public static class URPUniversalRendererRuntimeShadersHelper /// { /// public static Shader blit /// { /// get /// { /// var gs = GraphicsSettings.GetRenderPipelineSettings<UniversalRenderPipelineRuntimeShaders>(); /// if (gs == null) //not in URP /// return null; /// return gs.coreBlitPS; /// } /// } /// } /// /// [Serializable] [SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))] [Categorization.CategoryInfo(Name = "R: Runtime Shaders", Order = 1000), HideInInspector] public class UniversalRenderPipelineRuntimeShaders : IRenderPipelineResources { [SerializeField][HideInInspector] private int m_Version = 0; /// Current version of the resource container. Used only for upgrading a project. public int version => m_Version; bool IRenderPipelineGraphicsSettings.isAvailableInPlayerBuild => true; [SerializeField, ResourcePath("Shaders/Utils/FallbackError.shader")] Shader m_FallbackErrorShader; /// /// Fallback shader used when error happens. /// public Shader fallbackErrorShader { get => m_FallbackErrorShader; set => this.SetValueAndNotify(ref m_FallbackErrorShader, value, nameof(m_FallbackErrorShader)); } [SerializeField] [ResourcePath("Shaders/Utils/BlitHDROverlay.shader")] internal Shader m_BlitHDROverlay; /// /// Blit shader used for HDR Overlay. /// public Shader blitHDROverlay { get => m_BlitHDROverlay; set => this.SetValueAndNotify(ref m_BlitHDROverlay, value, nameof(m_BlitHDROverlay)); } [SerializeField] [ResourcePath("Shaders/Utils/CoreBlit.shader")] internal Shader m_CoreBlitPS; /// /// Default blit shader used for blit operation. /// public Shader coreBlitPS { get => m_CoreBlitPS; set => this.SetValueAndNotify(ref m_CoreBlitPS, value, nameof(m_CoreBlitPS)); } [SerializeField] [ResourcePath("Shaders/Utils/CoreBlitColorAndDepth.shader")] internal Shader m_CoreBlitColorAndDepthPS; /// /// Blit shader used for both Color And Depth blit operation. /// public Shader coreBlitColorAndDepthPS { get => m_CoreBlitColorAndDepthPS; set => this.SetValueAndNotify(ref m_CoreBlitColorAndDepthPS, value, nameof(m_CoreBlitColorAndDepthPS)); } [SerializeField] [ResourcePath("Shaders/Utils/Sampling.shader")] private Shader m_SamplingPS; /// /// Shader used when sampling is required. /// public Shader samplingPS { get => m_SamplingPS; set => this.SetValueAndNotify(ref m_SamplingPS, value, nameof(m_SamplingPS)); } #region Terrain [Header("Terrain")] // Original serialized fields preserved for migration purposes. // These fields maintain the original serialized data that was moved to UniversalRenderPipelineRuntimeTerrainShaders; // when the asset is migrated from version 9 to 10, these fields are copied to their equivalents in // UniversalRenderPipelineRuntimeTerrainShaders, and these are then set to null. [SerializeField, HideInInspector] private Shader m_TerrainDetailLit; [SerializeField, HideInInspector] private Shader m_TerrainDetailGrassBillboard; [SerializeField, HideInInspector] private Shader m_TerrainDetailGrass; // Internal methods to access original serialized fields for migration internal Shader GetOriginalTerrainDetailLitShader() => m_TerrainDetailLit; internal Shader GetOriginalTerrainDetailGrassBillboardShader() => m_TerrainDetailGrassBillboard; internal Shader GetOriginalTerrainDetailGrassShader() => m_TerrainDetailGrass; internal void ClearOriginalTerrainDetailShaders() { m_TerrainDetailLit = null; m_TerrainDetailGrassBillboard = null; m_TerrainDetailGrass = null; } /// /// Returns the terrain detail lit shader that this asset uses. /// [Obsolete("terrainDetailLitShader is obsolete. Use UniversalRenderPipelineRuntimeTerrainShaders.terrainDetailLitShader instead.", false)] public Shader terrainDetailLitShader { get { if (GraphicsSettings.TryGetRenderPipelineSettings( out var shadersResources)) { return shadersResources.terrainDetailLitShader; } return null; } set { if (GraphicsSettings.TryGetRenderPipelineSettings( out var shadersResources)) { shadersResources.terrainDetailLitShader = value; } } } /// /// Returns the terrain detail grass billboard shader that this asset uses. /// [Obsolete("terrainDetailGrassBillboardShader is obsolete. Use UniversalRenderPipelineRuntimeTerrainShaders.terrainDetailGrassBillboardShader instead.", false)] public Shader terrainDetailGrassBillboardShader { get { if (GraphicsSettings.TryGetRenderPipelineSettings( out var shadersResources)) { return shadersResources.terrainDetailGrassBillboardShader; } return null; } set { if (GraphicsSettings.TryGetRenderPipelineSettings( out var shadersResources)) { shadersResources.terrainDetailGrassBillboardShader = value; } } } /// /// Returns the terrain detail grass shader that this asset uses. /// [Obsolete("terrainDetailGrassShader is obsolete; Use UniversalRenderPipelineRuntimeTerrainShaders.terrainDetailGrassShader instead.)", false)] public Shader terrainDetailGrassShader { get { if (GraphicsSettings.TryGetRenderPipelineSettings( out var shadersResources)) { return shadersResources.terrainDetailGrassShader; } return null; } set { if (GraphicsSettings.TryGetRenderPipelineSettings( out var shadersResources)) { shadersResources.terrainDetailGrassShader = value; } } } #endregion } }