Skip to content

Commit 3f15b01

Browse files
committed
Added emission map. Upgrade selected, and specular power now has a similar computation to legacy ones (shininess multiply) so when upgrading projects lighting behaves more or like the same as legacy.
1 parent 61d8a6b commit 3f15b01

5 files changed

Lines changed: 81 additions & 50 deletions

File tree

Assets/LowEndMobilePipeline/Editor/LowendMobilePipelineMaterialEditor.cs

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@
44

55
public class LowendMobilePipelineMaterialEditor : MaterialEditor
66
{
7-
private MaterialProperty blendMode = null;
8-
private MaterialProperty albedoMap = null;
9-
private MaterialProperty albedoColor = null;
10-
private MaterialProperty alphaCutoff = null;
11-
private MaterialProperty specularSource = null;
7+
private MaterialProperty blendModeProp = null;
8+
private MaterialProperty albedoMapProp = null;
9+
private MaterialProperty albedoColorProp = null;
10+
private MaterialProperty alphaCutoffProp = null;
11+
private MaterialProperty specularSourceProp = null;
1212
private MaterialProperty glossinessSourceProp = null;
13-
private MaterialProperty specularGlossMap = null;
14-
private MaterialProperty specularColor = null;
15-
private MaterialProperty specularStrength = null;
16-
private MaterialProperty bumpMap = null;
17-
private MaterialProperty emissionColor = null;
13+
private MaterialProperty specularGlossMapProp = null;
14+
private MaterialProperty specularColorProp = null;
15+
private MaterialProperty shininessProp = null;
16+
private MaterialProperty bumpMapProp = null;
17+
private MaterialProperty emissionMapProp = null;
18+
private MaterialProperty emissionColorProp = null;
1819

1920
public enum BlendMode
2021
{
@@ -63,6 +64,7 @@ private static class Styles
6364
};
6465

6566
public static GUIContent normalMapText = new GUIContent("Normal Map", "Normal Map");
67+
public static GUIContent emissionMapLabel = new GUIContent("Emission Map", "Emission Map");
6668

6769
public static GUIContent alphaCutoutWarning =
6870
new GUIContent(
@@ -81,26 +83,27 @@ private static class Styles
8183
public static string albedoMapAlphaLabel = "Base(RGB) Alpha(A)";
8284
public static string albedoMapGlossinessLabel = "Base(RGB) Glossiness (A)";
8385
public static string alphaCutoffLabel = "Alpha Cutoff";
84-
public static string specularStrength = "Specular Strength";
86+
public static string shininessLabel = "Shininess";
8587
public static string normalMapLabel = "Normal map";
8688
public static string emissionColorLabel = "Emission Color";
8789
}
8890

8991
private void FindMaterialProperties(Material material)
9092
{
9193
Material[] mats = { material };
92-
blendMode = GetMaterialProperty(mats, "_Mode");
93-
albedoMap = GetMaterialProperty(mats, "_MainTex");
94-
albedoColor = GetMaterialProperty(mats, "_Color");
94+
blendModeProp = GetMaterialProperty(mats, "_Mode");
95+
albedoMapProp = GetMaterialProperty(mats, "_MainTex");
96+
albedoColorProp = GetMaterialProperty(mats, "_Color");
9597

96-
alphaCutoff = GetMaterialProperty(mats, "_Cutoff");
97-
specularSource = GetMaterialProperty(mats, "_SpecSource");
98+
alphaCutoffProp = GetMaterialProperty(mats, "_Cutoff");
99+
specularSourceProp = GetMaterialProperty(mats, "_SpecSource");
98100
glossinessSourceProp = GetMaterialProperty(mats, "_GlossinessSource");
99-
specularGlossMap = GetMaterialProperty(mats, "_SpecGlossMap");
100-
specularColor = GetMaterialProperty(mats, "_SpecColor");
101-
specularStrength = GetMaterialProperty(mats, "_SpecularStrength");
102-
bumpMap = GetMaterialProperty(mats, "_BumpMap");
103-
emissionColor = GetMaterialProperty(mats, "_EmissionColor");
101+
specularGlossMapProp = GetMaterialProperty(mats, "_SpecGlossMap");
102+
specularColorProp = GetMaterialProperty(mats, "_SpecColor");
103+
shininessProp = GetMaterialProperty(mats, "_Shininess");
104+
bumpMapProp = GetMaterialProperty(mats, "_BumpMap");
105+
emissionMapProp = GetMaterialProperty(mats, "_EmissionMap");
106+
emissionColorProp = GetMaterialProperty(mats, "_EmissionColor");
104107
}
105108

106109
public override void OnInspectorGUI()
@@ -119,18 +122,18 @@ public override void OnInspectorGUI()
119122
DoSpecular();
120123

121124
EditorGUILayout.Space();
122-
TexturePropertySingleLine(Styles.normalMapText, bumpMap);
125+
TexturePropertySingleLine(Styles.normalMapText, bumpMapProp);
123126

124127
EditorGUILayout.Space();
125-
ColorProperty(emissionColor, Styles.emissionColorLabel);
128+
TexturePropertySingleLine(Styles.emissionMapLabel, emissionMapProp, emissionColorProp);
126129

127130
if (EditorGUI.EndChangeCheck())
128131
UpdateMaterialKeywords(material);
129132

130133
EditorGUILayout.Space();
131134
EditorGUILayout.Space();
132135

133-
if ((BlendMode)blendMode.floatValue == BlendMode.Cutout)
136+
if ((BlendMode)blendModeProp.floatValue == BlendMode.Cutout)
134137
{
135138
Styles.warningStyle.normal.textColor = Color.yellow;
136139
EditorGUILayout.LabelField(Styles.alphaCutoutWarning, Styles.warningStyle);
@@ -140,46 +143,46 @@ public override void OnInspectorGUI()
140143

141144
private void DoBlendMode()
142145
{
143-
int modeValue = (int)blendMode.floatValue;
146+
int modeValue = (int)blendModeProp.floatValue;
144147
EditorGUI.BeginChangeCheck();
145148
modeValue = EditorGUILayout.Popup(Styles.renderingModeLabel, modeValue, Styles.blendNames);
146149
if (EditorGUI.EndChangeCheck())
147-
blendMode.floatValue = modeValue;
150+
blendModeProp.floatValue = modeValue;
148151

149-
BlendMode mode = (BlendMode)blendMode.floatValue;
152+
BlendMode mode = (BlendMode)blendModeProp.floatValue;
150153

151154
EditorGUILayout.Space();
152155

153156
if (mode == BlendMode.Opaque)
154157
{
155158
int glossSource = (int)glossinessSourceProp.floatValue;
156-
TexturePropertySingleLine(Styles.albedoGlosinessLabels[glossSource], albedoMap, albedoColor);
157-
TextureScaleOffsetProperty(albedoMap);
159+
TexturePropertySingleLine(Styles.albedoGlosinessLabels[glossSource], albedoMapProp, albedoColorProp);
160+
TextureScaleOffsetProperty(albedoMapProp);
158161
}
159162
else
160163
{
161-
TexturePropertySingleLine(Styles.albedoAlphaLabel, albedoMap, albedoColor);
162-
TextureScaleOffsetProperty(albedoMap);
164+
TexturePropertySingleLine(Styles.albedoAlphaLabel, albedoMapProp, albedoColorProp);
165+
TextureScaleOffsetProperty(albedoMapProp);
163166
if (mode == BlendMode.Cutout)
164-
RangeProperty(alphaCutoff, "Cutoff");
167+
RangeProperty(alphaCutoffProp, "Cutoff");
165168
}
166169
}
167170

168171
private void DoSpecular()
169172
{
170173
EditorGUILayout.Space();
171174

172-
int source = (int)specularSource.floatValue;
175+
int source = (int)specularSourceProp.floatValue;
173176
EditorGUI.BeginChangeCheck();
174177
source = EditorGUILayout.Popup(Styles.specularSourceLabel, source, Styles.specSourceNames);
175178
if (EditorGUI.EndChangeCheck())
176179
{
177-
specularSource.floatValue = source;
180+
specularSourceProp.floatValue = source;
178181
if (source == (int)SpecularSource.BaseTexture)
179182
glossinessSourceProp.floatValue = (float)GlossinessSource.BaseAlpha;
180183
}
181184

182-
SpecularSource specSource = (SpecularSource)specularSource.floatValue;
185+
SpecularSource specSource = (SpecularSource)specularSourceProp.floatValue;
183186
if (specSource != SpecularSource.NoSpecular)
184187
{
185188
int glossinessSource = (int)glossinessSourceProp.floatValue;
@@ -193,12 +196,12 @@ private void DoSpecular()
193196
int glossSource = (int)glossinessSourceProp.floatValue;
194197
if (specSource == SpecularSource.SpecularTextureAndColor)
195198
{
196-
TexturePropertySingleLine(Styles.specularGlossMapLabels[glossSource], specularGlossMap, specularColor);
199+
TexturePropertySingleLine(Styles.specularGlossMapLabels[glossSource], specularGlossMapProp, specularColorProp);
197200
}
198201

199202
if (specSource != SpecularSource.NoSpecular)
200203
{
201-
RangeProperty(specularStrength, Styles.specularStrength);
204+
RangeProperty(shininessProp, Styles.shininessLabel);
202205
}
203206
}
204207

@@ -212,7 +215,7 @@ private void UpdateMaterialKeywords(Material material)
212215

213216
private void UpdateMaterialBlendMode(Material material)
214217
{
215-
BlendMode mode = (BlendMode)blendMode.floatValue;
218+
BlendMode mode = (BlendMode)blendModeProp.floatValue;
216219
switch (mode)
217220
{
218221
case BlendMode.Opaque:
@@ -246,7 +249,7 @@ private void UpdateMaterialBlendMode(Material material)
246249

247250
private void UpdateMaterialSpecularSource(Material material)
248251
{
249-
SpecularSource specSource = (SpecularSource)specularSource.floatValue;
252+
SpecularSource specSource = (SpecularSource)specularSourceProp.floatValue;
250253
if (specSource == SpecularSource.NoSpecular)
251254
{
252255
SetKeyword(material, "_SHARED_SPECULAR_DIFFUSE", false);

Assets/LowEndMobilePipeline/Editor/StandardToLowEndMaterialUpgrader.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
public class StandardToLowEndMaterialUpgrader : MaterialUpgrader
66
{
7-
[MenuItem("RenderPipeline/LowEndMobilePipeline/Material Upgraders/Upgrade Standard Materials to Low End Mobile")]
8-
private static void UpgradeMaterialsToLD()
7+
[MenuItem("RenderPipeline/LowEndMobilePipeline/Material Upgraders/Upgrade Standard Materials to Low End Mobile - Selection")]
8+
private static void UpgradeMaterialsToLDProject()
99
{
1010
List<MaterialUpgrader> upgraders = new List<MaterialUpgrader>();
1111
upgraders.Add(new StandardToLowEndMaterialUpgrader("Standard (Specular setup)"));
@@ -15,6 +15,17 @@ private static void UpgradeMaterialsToLD()
1515
MaterialUpgrader.UpgradeProjectFolder(upgraders, "Upgrade to LD Materials");
1616
}
1717

18+
[MenuItem("RenderPipeline/LowEndMobilePipeline/Material Upgraders/Upgrade Standard Materials to Low End Mobile - Project Folder")]
19+
private static void UpgradeMaterialsToLDSelection()
20+
{
21+
List<MaterialUpgrader> upgraders = new List<MaterialUpgrader>();
22+
upgraders.Add(new StandardToLowEndMaterialUpgrader("Standard (Specular setup)"));
23+
upgraders.Add(new StandardToLowEndMaterialUpgrader("Standard"));
24+
upgraders.Add(new StandardToLowEndMaterialUpgrader("TerrainSurface"));
25+
26+
MaterialUpgrader.UpgradeSelection(upgraders, "Upgrade to LD Materials");
27+
}
28+
1829
StandardToLowEndMaterialUpgrader(string oldShaderName)
1930
{
2031
RenameShader(oldShaderName, "ScriptableRenderPipeline/LowEndMobile");

Assets/LowEndMobilePipeline/LowEndMobilePipeline.shader

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
99

1010
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
1111

12-
_Glossiness("Shininess", Range(0.0, 1.0)) = 0.5
13-
_SpecularStrength("Specular Strength", Range(0.0, 255.0)) = 200
12+
_Glossiness("Glossiness", Range(0.0, 1.0)) = 0.5
13+
_Shininess("Shininess", Range(0.0, 1.0)) = 1.0
1414
_GlossMapScale("Smoothness Factor", Range(0.0, 1.0)) = 1.0
1515
[Enum(Specular Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0
1616

@@ -70,6 +70,7 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
7070
#pragma shader_feature _ _SHARED_SPECULAR_DIFFUSE _SPECGLOSSMAP _SPECULAR_COLOR
7171
#pragma shader_feature _GLOSSINESS_FROM_BASE_ALPHA
7272
#pragma shader_feature _NORMALMAP
73+
#pragma shader_feature _EMISSION_MAP
7374

7475
#pragma multi_compile _ LIGHTMAP_ON
7576
#pragma multi_compile _ HARD_SHADOWS SOFT_SHADOWS
@@ -140,7 +141,7 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
140141
half alpha = diffuseAlpha.a * _Color.a;
141142

142143
// Keep for compatibility reasons. Shader Inpector throws a warning when using cutoff
143-
// due overdraw performance impact.
144+
// due overdraw performance impact.
144145
#ifdef _ALPHATEST_ON
145146
clip(alpha - _Cutoff);
146147
#endif
@@ -155,6 +156,9 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
155156
half3 indirectDiffuse;
156157
IndirectDiffuse(i, diffuse, indirectDiffuse);
157158

159+
half3 emissionColor;
160+
Emission(i, emissionColor);
161+
158162
// Compute direct contribution from main directional light.
159163
// Only a single directional shadow caster is supported.
160164
LightInput mainLight;
@@ -166,7 +170,7 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
166170
#if defined(HARD_SHADOWS) || defined(SOFT_SHADOWS)
167171
directColor *= ComputeShadowAttenuation(i);
168172
#endif
169-
173+
170174
// Compute direct contribution from additional lights.
171175
for (int lightIndex = 1; lightIndex < globalLightCount.x; ++lightIndex)
172176
{
@@ -175,7 +179,7 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
175179
directColor += EvaluateOneLight(additionalLight, diffuse, specularGloss, normal, i.posWS, viewDir);
176180
}
177181

178-
half3 color = directColor + indirectDiffuse + _EmissionColor;
182+
half3 color = directColor + indirectDiffuse + emissionColor;
179183
UNITY_APPLY_FOG(i.fogCoord, color);
180184

181185
return OutputColor(color, alpha);
@@ -270,6 +274,6 @@ Shader "ScriptableRenderPipeline/LowEndMobile"
270274
ENDCG
271275
}
272276
}
273-
Fallback "Standard (Specular setup)"
274-
CustomEditor "LowendMobilePipelineMaterialEditor"
277+
Fallback "Standard (Specular setup)"
278+
CustomEditor "LowendMobilePipelineMaterialEditor"
275279
}

Assets/LowEndMobilePipeline/LowEndMobilePipelineCore.cginc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ float _PCFKernel[8];
5858

5959
half4x4 _WorldToShadow[MAX_SHADOW_CASCADES];
6060
float4 _DirShadowSplitSpheres[MAX_SHADOW_CASCADES];
61-
half _SpecularStrength;
61+
half _Shininess;
6262

6363

6464
inline void NormalMap(v2f i, out half3 normal)
@@ -97,6 +97,15 @@ inline void SpecularGloss(half3 diffuse, half alpha, out half4 specularGloss)
9797
#endif
9898
}
9999

100+
inline void Emission(v2f i, out half3 emission)
101+
{
102+
#ifdef _EMISSION_MAP
103+
emission = tex2D(_EmissionMap, i.uv01.xy) * _EmissionColor
104+
#else
105+
emission = _EmissionColor;
106+
#endif
107+
}
108+
100109
inline void IndirectDiffuse(v2f i, half3 diffuse, out half3 indirectDiffuse)
101110
{
102111
#ifdef LIGHTMAP_ON
@@ -181,7 +190,7 @@ inline half3 EvaluateOneLight(LightInput lightInput, half3 diffuseColor, half4 s
181190
half3 diffuse = diffuseColor * lightColor * NdotL;
182191

183192
#if defined(_SHARED_SPECULAR_DIFFUSE) || defined(_SPECGLOSSMAP) || defined(_SPECULAR_COLOR)
184-
half3 specular = specularGloss.rgb * lightColor * pow(NdotH, 256.0 - _SpecularStrength) * specularGloss.a;
193+
half3 specular = specularGloss.rgb * lightColor * pow(NdotH, _Shininess * 128.0) * specularGloss.a;
185194
return diffuse + specular;
186195
#else
187196
return diffuse;

Assets/ScriptableRenderPipeline/Editor/MaterialUpgrader.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ public static void Upgrade(Material material, List<MaterialUpgrader> upgraders,
165165

166166
public static void UpgradeSelection(List<MaterialUpgrader> upgraders, string progressBarName)
167167
{
168+
if (!EditorUtility.DisplayDialog("Material Upgrader", "The upgrade will overwrite all selected material settings" +
169+
"Be sure to have a project backup before proceeding", "Proceed", "Cancel"))
170+
return;
171+
168172
string lastMaterialName = "";
169173
var selection = Selection.objects;
170174
for (int i = 0; i < selection.Length; i++)

0 commit comments

Comments
 (0)