Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

157 行
7.2 KiB

using System;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Scripting.APIUpdating;
namespace UnityEditor.Rendering.Universal.ShaderGUI
{
[MovedFrom("UnityEditor.Rendering.LWRP.ShaderGUI")] public static class SimpleLitGUI
{
public enum SpecularSource
{
SpecularTextureAndColor,
NoSpecular
}
public enum SmoothnessMapChannel
{
SpecularAlpha,
AlbedoAlpha,
}
public static class Styles
{
public static GUIContent specularMapText =
new GUIContent("Specular Map", "Sets and configures a Specular map and color for your Material.");
public static GUIContent smoothnessText = new GUIContent("Smoothness",
"Controls the spread of highlights and reflections on the surface.");
public static GUIContent smoothnessMapChannelText =
new GUIContent("Source",
"Specifies where to sample a smoothness map from. By default, uses the alpha channel for your map.");
public static GUIContent highlightsText = new GUIContent("Specular Highlights",
"When enabled, the Material reflects the shine from direct lighting.");
}
public struct SimpleLitProperties
{
// Surface Input Props
public MaterialProperty specColor;
public MaterialProperty specGlossMap;
public MaterialProperty specHighlights;
public MaterialProperty smoothnessMapChannel;
public MaterialProperty smoothness;
public MaterialProperty bumpMapProp;
public SimpleLitProperties(MaterialProperty[] properties)
{
// Surface Input Props
specColor = BaseShaderGUI.FindProperty("_SpecColor", properties);
specGlossMap = BaseShaderGUI.FindProperty("_SpecGlossMap", properties, false);
specHighlights = BaseShaderGUI.FindProperty("_SpecularHighlights", properties, false);
smoothnessMapChannel = BaseShaderGUI.FindProperty("_SmoothnessSource", properties, false);
smoothness = BaseShaderGUI.FindProperty("_Smoothness", properties, false);
bumpMapProp = BaseShaderGUI.FindProperty("_BumpMap", properties, false);
}
}
public static void Inputs(SimpleLitProperties properties, MaterialEditor materialEditor, Material material)
{
DoSpecularArea(properties, materialEditor, material);
BaseShaderGUI.DrawNormalArea(materialEditor, properties.bumpMapProp);
}
public static void Advanced(SimpleLitProperties properties)
{
SpecularSource specularSource = (SpecularSource)properties.specHighlights.floatValue;
EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = properties.specHighlights.hasMixedValue;
bool enabled = EditorGUILayout.Toggle(Styles.highlightsText, specularSource == SpecularSource.SpecularTextureAndColor);
if (EditorGUI.EndChangeCheck())
properties.specHighlights.floatValue = enabled ? (float)SpecularSource.SpecularTextureAndColor : (float)SpecularSource.NoSpecular;
EditorGUI.showMixedValue = false;
}
public static void DoSpecularArea(SimpleLitProperties properties, MaterialEditor materialEditor, Material material)
{
SpecularSource specSource = (SpecularSource)properties.specHighlights.floatValue;
EditorGUI.BeginDisabledGroup(specSource == SpecularSource.NoSpecular);
BaseShaderGUI.TextureColorProps(materialEditor, Styles.specularMapText, properties.specGlossMap,properties.specColor, true);
DoSmoothness(properties, material);
EditorGUI.EndDisabledGroup();
}
public static void DoSmoothness(SimpleLitProperties properties, Material material)
{
var opaque = ((BaseShaderGUI.SurfaceType) material.GetFloat("_Surface") ==
BaseShaderGUI.SurfaceType.Opaque);
EditorGUI.indentLevel += 2;
EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = properties.smoothness.hasMixedValue;
var smoothnessSource = (int)properties.smoothnessMapChannel.floatValue;
var smoothness = properties.smoothness.floatValue;
smoothness = EditorGUILayout.Slider(Styles.smoothnessText, smoothness, 0f, 1f);
if (EditorGUI.EndChangeCheck())
{
properties.smoothness.floatValue = smoothness;
}
EditorGUI.showMixedValue = false;
EditorGUI.indentLevel++;
EditorGUI.BeginDisabledGroup(!opaque);
EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = properties.smoothnessMapChannel.hasMixedValue;
if(opaque)
smoothnessSource = EditorGUILayout.Popup(Styles.smoothnessMapChannelText, smoothnessSource, Enum.GetNames(typeof(SmoothnessMapChannel)));
else
EditorGUILayout.Popup(Styles.smoothnessMapChannelText, 0, Enum.GetNames(typeof(SmoothnessMapChannel)));
if (EditorGUI.EndChangeCheck())
properties.smoothnessMapChannel.floatValue = smoothnessSource;
EditorGUI.showMixedValue = false;
EditorGUI.indentLevel -= 3;
EditorGUI.EndDisabledGroup();
}
public static void SetMaterialKeywords(Material material)
{
UpdateMaterialSpecularSource(material);
}
private static void UpdateMaterialSpecularSource(Material material)
{
var opaque = ((BaseShaderGUI.SurfaceType) material.GetFloat("_Surface") ==
BaseShaderGUI.SurfaceType.Opaque);
SpecularSource specSource = (SpecularSource)material.GetFloat("_SpecularHighlights");
if (specSource == SpecularSource.NoSpecular)
{
CoreUtils.SetKeyword(material, "_SPECGLOSSMAP", false);
CoreUtils.SetKeyword(material, "_SPECULAR_COLOR", false);
CoreUtils.SetKeyword(material, "_GLOSSINESS_FROM_BASE_ALPHA", false);
}
else
{
var smoothnessSource = (SmoothnessMapChannel)material.GetFloat("_SmoothnessSource");
bool hasMap = material.GetTexture("_SpecGlossMap");
CoreUtils.SetKeyword(material, "_SPECGLOSSMAP", hasMap);
CoreUtils.SetKeyword(material, "_SPECULAR_COLOR", !hasMap);
if(opaque)
CoreUtils.SetKeyword(material, "_GLOSSINESS_FROM_BASE_ALPHA", smoothnessSource == SmoothnessMapChannel.AlbedoAlpha);
else
CoreUtils.SetKeyword(material, "_GLOSSINESS_FROM_BASE_ALPHA", false);
string color;
if (smoothnessSource != SmoothnessMapChannel.AlbedoAlpha || !opaque)
color = "_SpecColor";
else
color = "_BaseColor";
var col = material.GetColor(color);
col.a = material.GetFloat("_Smoothness");
material.SetColor(color, col);
}
}
}
}