Skip to content

Commit 50cc14a

Browse files
SouravUnityEvergreen
authored andcommitted
[Port] [6000.3] [URP] Add option to control inclusion of terrain shaders in URP.
1 parent 9329c78 commit 50cc14a

9 files changed

Lines changed: 345 additions & 21 deletions

Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.DefaultResources.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public override Shader terrainDetailLitShader
144144
{
145145
get
146146
{
147-
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeShaders>(
147+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
148148
out var shadersResources))
149149
{
150150
return shadersResources.terrainDetailLitShader;
@@ -161,7 +161,7 @@ public override Shader terrainDetailGrassShader
161161
{
162162
get
163163
{
164-
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeShaders>(
164+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
165165
out var shadersResources))
166166
{
167167
return shadersResources.terrainDetailGrassShader;
@@ -178,7 +178,7 @@ public override Shader terrainDetailGrassBillboardShader
178178
{
179179
get
180180
{
181-
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeShaders>(
181+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
182182
out var shadersResources))
183183
{
184184
return shadersResources.terrainDetailGrassBillboardShader;

Packages/com.unity.render-pipelines.universal/Runtime/RenderPipelineResources/UniversalRenderPipelineRuntimeShaders.cs

Lines changed: 73 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -109,43 +109,99 @@ public Shader samplingPS
109109

110110
#region Terrain
111111
[Header("Terrain")]
112-
[SerializeField]
113-
[ResourcePath("Shaders/Terrain/TerrainDetailLit.shader")]
114-
private Shader m_TerrainDetailLit;
115112

113+
// Original serialized fields preserved for migration purposes.
114+
// These fields maintain the original serialized data that was moved to UniversalRenderPipelineRuntimeTerrainShaders;
115+
// when the asset is migrated from version 9 to 10, these fields are copied to their equivalents in
116+
// UniversalRenderPipelineRuntimeTerrainShaders, and these are then set to null.
117+
[SerializeField, HideInInspector] private Shader m_TerrainDetailLit;
118+
[SerializeField, HideInInspector] private Shader m_TerrainDetailGrassBillboard;
119+
[SerializeField, HideInInspector] private Shader m_TerrainDetailGrass;
120+
121+
// Internal methods to access original serialized fields for migration
122+
internal Shader GetOriginalTerrainDetailLitShader() => m_TerrainDetailLit;
123+
internal Shader GetOriginalTerrainDetailGrassBillboardShader() => m_TerrainDetailGrassBillboard;
124+
internal Shader GetOriginalTerrainDetailGrassShader() => m_TerrainDetailGrass;
125+
internal void ClearOriginalTerrainDetailShaders()
126+
{
127+
m_TerrainDetailLit = null;
128+
m_TerrainDetailGrassBillboard = null;
129+
m_TerrainDetailGrass = null;
130+
}
131+
116132
/// <summary>
117133
/// Returns the terrain detail lit shader that this asset uses.
118134
/// </summary>
135+
[Obsolete("terrainDetailLitShader is obsolete. Use UniversalRenderPipelineRuntimeTerrainShaders.terrainDetailLitShader instead.", false)]
119136
public Shader terrainDetailLitShader
120137
{
121-
get => m_TerrainDetailLit;
122-
set => this.SetValueAndNotify(ref m_TerrainDetailLit, value);
138+
get
139+
{
140+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
141+
out var shadersResources))
142+
{
143+
return shadersResources.terrainDetailLitShader;
144+
}
145+
return null;
146+
}
147+
set
148+
{
149+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
150+
out var shadersResources))
151+
{
152+
shadersResources.terrainDetailLitShader = value;
153+
}
154+
}
123155
}
124156

125-
[SerializeField]
126-
[ResourcePath("Shaders/Terrain/WavingGrassBillboard.shader")]
127-
private Shader m_TerrainDetailGrassBillboard;
128-
129157
/// <summary>
130158
/// Returns the terrain detail grass billboard shader that this asset uses.
131159
/// </summary>
160+
[Obsolete("terrainDetailGrassBillboardShader is obsolete. Use UniversalRenderPipelineRuntimeTerrainShaders.terrainDetailGrassBillboardShader instead.", false)]
132161
public Shader terrainDetailGrassBillboardShader
133162
{
134-
get => m_TerrainDetailGrassBillboard;
135-
set => this.SetValueAndNotify(ref m_TerrainDetailGrassBillboard, value);
163+
get
164+
{
165+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
166+
out var shadersResources))
167+
{
168+
return shadersResources.terrainDetailGrassBillboardShader;
169+
}
170+
return null;
171+
}
172+
set
173+
{
174+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
175+
out var shadersResources))
176+
{
177+
shadersResources.terrainDetailGrassBillboardShader = value;
178+
}
179+
}
136180
}
137181

138-
[SerializeField]
139-
[ResourcePath("Shaders/Terrain/WavingGrass.shader")]
140-
private Shader m_TerrainDetailGrass;
141-
142182
/// <summary>
143183
/// Returns the terrain detail grass shader that this asset uses.
144184
/// </summary>
185+
[Obsolete("terrainDetailGrassShader is obsolete; Use UniversalRenderPipelineRuntimeTerrainShaders.terrainDetailGrassShader instead.)", false)]
145186
public Shader terrainDetailGrassShader
146187
{
147-
get => m_TerrainDetailGrass;
148-
set => this.SetValueAndNotify(ref m_TerrainDetailGrass, value);
188+
get
189+
{
190+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
191+
out var shadersResources))
192+
{
193+
return shadersResources.terrainDetailGrassShader;
194+
}
195+
return null;
196+
}
197+
set
198+
{
199+
if (GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeTerrainShaders>(
200+
out var shadersResources))
201+
{
202+
shadersResources.terrainDetailGrassShader = value;
203+
}
204+
}
149205
}
150206
#endregion
151207
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System;
2+
3+
namespace UnityEngine.Rendering.Universal
4+
{
5+
/// <summary>
6+
/// A resource container for shaders used for terrains in <see cref="UniversalRenderPipeline"/>.
7+
/// </summary>
8+
/// <remarks>
9+
/// You cannot edit these resources through the editor's UI; use the API for advanced changes.
10+
/// Changing this through the API is only allowed in the Editor. In the Player, this raises an error.
11+
/// </remarks>
12+
/// <seealso cref="IRenderPipelineResources"/>
13+
/// <example>
14+
/// <para> Here is an example of how to get the terrain detail lit shader used by URP. </para>
15+
/// <code>
16+
/// using UnityEngine.Rendering;
17+
/// using UnityEngine.Rendering.Universal;
18+
///
19+
/// public static class URPUniversalRendererRuntimeShadersHelper
20+
/// {
21+
/// public static Shader terrainDetailLit
22+
/// {
23+
/// get
24+
/// {
25+
/// if (GraphicsSettings.TryGetRenderPipelineSettings&lt;UniversalRenderPipelineRuntimeTerrainShaders&gt;(
26+
/// out var shadersResources))
27+
/// {
28+
/// return shadersResources.terrainDetailLitShader;
29+
/// }
30+
/// return null;
31+
/// }
32+
/// }
33+
/// }
34+
/// </code>
35+
/// </example>
36+
[Serializable]
37+
[SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))]
38+
[Categorization.CategoryInfo(Name = "R: Runtime Shaders", Order = 1000), HideInInspector]
39+
public class UniversalRenderPipelineRuntimeTerrainShaders : IRenderPipelineResources
40+
{
41+
[SerializeField][HideInInspector] private int m_Version = 0;
42+
43+
/// <summary>The current version of the resource container. Used only for upgrading a project.</summary>
44+
public int version => m_Version;
45+
46+
bool IRenderPipelineGraphicsSettings.isAvailableInPlayerBuild
47+
{
48+
get
49+
{
50+
// Check if the setting exists and is enabled
51+
if (GraphicsSettings.TryGetRenderPipelineSettings<URPTerrainShaderSetting>(out var settings))
52+
{
53+
return settings.includeTerrainShaders;
54+
}
55+
return false; // Default to not including if settings don't exist
56+
}
57+
}
58+
59+
[SerializeField]
60+
[ResourcePath("Shaders/Terrain/TerrainDetailLit.shader")]
61+
private Shader m_TerrainDetailLit;
62+
63+
/// <summary>
64+
/// Returns the terrain detail lit shader that this asset uses.
65+
/// </summary>
66+
public Shader terrainDetailLitShader
67+
{
68+
get => m_TerrainDetailLit;
69+
set => this.SetValueAndNotify(ref m_TerrainDetailLit, value);
70+
}
71+
72+
[SerializeField]
73+
[ResourcePath("Shaders/Terrain/WavingGrassBillboard.shader")]
74+
private Shader m_TerrainDetailGrassBillboard;
75+
76+
/// <summary>
77+
/// Returns the terrain detail grass billboard shader that this asset uses.
78+
/// </summary>
79+
public Shader terrainDetailGrassBillboardShader
80+
{
81+
get => m_TerrainDetailGrassBillboard;
82+
set => this.SetValueAndNotify(ref m_TerrainDetailGrassBillboard, value);
83+
}
84+
85+
[SerializeField]
86+
[ResourcePath("Shaders/Terrain/WavingGrass.shader")]
87+
private Shader m_TerrainDetailGrass;
88+
89+
/// <summary>
90+
/// Returns the terrain detail grass shader that this asset uses.
91+
/// </summary>
92+
public Shader terrainDetailGrassShader
93+
{
94+
get => m_TerrainDetailGrass;
95+
set => this.SetValueAndNotify(ref m_TerrainDetailGrass, value);
96+
}
97+
}
98+
}

Packages/com.unity.render-pipelines.universal/Runtime/RenderPipelineResources/UniversalRenderPipelineRuntimeTerrainShaders.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
3+
namespace UnityEngine.Rendering.Universal
4+
{
5+
/// <summary>
6+
/// A Graphics Settings container for settings related to terrain shaders in <see cref="UniversalRenderPipeline"/>.
7+
/// </summary>
8+
/// <remarks>
9+
/// To change those settings, go to Editor > Project Settings in the Graphics tab (URP).
10+
/// Changing those settings through the API is only allowed in the Editor. In the Player, this raises an error.
11+
///
12+
/// Unity removes this container from Players at build time.
13+
/// </remarks>
14+
/// <seealso cref="IRenderPipelineGraphicsSettings"/>
15+
/// <example>
16+
/// <para> Here is an example of how to determine if your project has included terrain shaders when building a Player with URP. </para>
17+
/// <code>
18+
/// using UnityEngine.Rendering;
19+
/// using UnityEngine.Rendering.Universal;
20+
///
21+
/// public static class URPTerrainShaderHelper
22+
/// {
23+
/// public static bool enabled
24+
/// {
25+
/// get
26+
/// {
27+
/// var gs = GraphicsSettings.GetRenderPipelineSettings&lt;URPTerrainShaderSetting&gt;();
28+
/// if (gs == null) //not in URP or in a Player
29+
/// return false;
30+
/// return gs.includeTerrainShaders;
31+
/// }
32+
/// }
33+
/// }
34+
/// </code>
35+
/// </example>
36+
[Serializable]
37+
[SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))]
38+
[Categorization.CategoryInfo(Name = "Terrain Shader Inclusion Settings", Order = 50)]
39+
[Categorization.ElementInfo(Order = 10)]
40+
public class URPTerrainShaderSetting : IRenderPipelineGraphicsSettings
41+
{
42+
#region Version
43+
internal enum Version : int
44+
{
45+
Initial = 0,
46+
}
47+
48+
[SerializeField][HideInInspector]
49+
private Version m_Version;
50+
51+
/// <summary>Indicates the current version of this settings container. Used exclusively for project upgrades.</summary>
52+
public int version => (int)m_Version;
53+
#endregion
54+
55+
#region Settings
56+
[SerializeField]
57+
[Tooltip("Include terrain shaders in build even if not referenced.")]
58+
bool m_IncludeTerrainShaders = true;
59+
60+
/// <summary>
61+
/// Controls whether terrain shaders are included in the build.
62+
/// </summary>
63+
public bool includeTerrainShaders
64+
{
65+
get => m_IncludeTerrainShaders;
66+
set => this.SetValueAndNotify(ref m_IncludeTerrainShaders, value);
67+
}
68+
#endregion
69+
}
70+
}

Packages/com.unity.render-pipelines.universal/Runtime/Settings/URPTerrainShaderSetting.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineGlobalSettings.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ partial class UniversalRenderPipelineGlobalSettings : RenderPipelineGlobalSettin
2828

2929
internal bool IsAtLastVersion() => k_LastVersion == m_AssetVersion;
3030

31-
internal const int k_LastVersion = 9;
31+
internal const int k_LastVersion = 10;
3232

3333
#pragma warning disable CS0414
3434
[SerializeField][FormerlySerializedAs("k_AssetVersion")]
@@ -168,6 +168,13 @@ public static void UpgradeAsset(EntityId assetInstanceID)
168168
asset.m_AssetVersion = 9;
169169
}
170170

171+
// Migrate terrain shader settings from UniversalRenderPipelineRuntimeShaders to UniversalRenderPipelineRuntimeTerrainShaders
172+
if (asset.m_AssetVersion < 10)
173+
{
174+
MigrateTerrainShaderSettings(asset);
175+
asset.m_AssetVersion = 10;
176+
}
177+
171178
// If the asset version has changed, means that a migration step has been executed
172179
if (assetVersionBeforeUpgrade != asset.m_AssetVersion)
173180
EditorUtility.SetDirty(asset);
@@ -239,6 +246,31 @@ static void MigrateDefaultVolumeProfile(UniversalRenderPipelineGlobalSettings da
239246
#pragma warning restore 618 // Type or member is obsolete
240247
}
241248

249+
static void MigrateTerrainShaderSettings(UniversalRenderPipelineGlobalSettings data)
250+
{
251+
try
252+
{
253+
// Get existing UniversalRenderPipelineRuntimeShaders settings
254+
if (!GraphicsSettings.TryGetRenderPipelineSettings<UniversalRenderPipelineRuntimeShaders>(out var runtimeShaders))
255+
{
256+
return;
257+
}
258+
259+
// Create/get UniversalRenderPipelineRuntimeTerrainShaders container
260+
var runtimeTerrainShaders = GetOrCreateGraphicsSettings<UniversalRenderPipelineRuntimeTerrainShaders>(data);
261+
262+
// Migrate terrain shaders from runtimeShaders to terrainShaders
263+
runtimeTerrainShaders.terrainDetailLitShader = runtimeShaders.GetOriginalTerrainDetailLitShader();
264+
runtimeTerrainShaders.terrainDetailGrassBillboardShader = runtimeShaders.GetOriginalTerrainDetailGrassBillboardShader();
265+
runtimeTerrainShaders.terrainDetailGrassShader = runtimeShaders.GetOriginalTerrainDetailGrassShader();
266+
runtimeShaders.ClearOriginalTerrainDetailShaders();
267+
}
268+
catch (System.Exception ex)
269+
{
270+
Debug.LogWarning($"URP: Failed to migrate terrain detail shader settings: {ex.Message}. Terrain detail shaders will use default values.");
271+
}
272+
}
273+
242274
#endif // #if UNITY_EDITOR
243275

244276
#endregion

0 commit comments

Comments
 (0)