您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
123 行
5.3 KiB
123 行
5.3 KiB
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
public abstract class LightweightShaderGUI : ShaderGUI
|
|
{
|
|
public enum SurfaceType
|
|
{
|
|
Opaque,
|
|
Transparent
|
|
}
|
|
|
|
public enum BlendMode
|
|
{
|
|
Alpha, // Old school alpha-blending mode, fresnel does not affect amount of transparency
|
|
Premultiply, // Physically plausible transparency mode, implemented as alpha pre-multiply
|
|
Additive,
|
|
Multiply
|
|
}
|
|
|
|
public abstract void FindProperties(MaterialProperty[] props);
|
|
public abstract void ShaderPropertiesGUI(Material material);
|
|
public abstract void MaterialChanged(Material material);
|
|
|
|
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
|
|
{
|
|
FindProperties(properties); // MaterialProperties can be animated so we do not cache them but fetch them every event to ensure animated values are updated correctly
|
|
m_MaterialEditor = materialEditor;
|
|
Material material = materialEditor.target as Material;
|
|
|
|
// Make sure that needed setup (ie keywords/renderqueue) are set up if we're switching some existing
|
|
// material to a lightweight shader.
|
|
if (m_FirstTimeApply)
|
|
{
|
|
MaterialChanged(material);
|
|
m_FirstTimeApply = false;
|
|
}
|
|
|
|
ShaderPropertiesGUI(material);
|
|
}
|
|
|
|
protected void DoPopup(string label, MaterialProperty property, string[] options)
|
|
{
|
|
EditorGUI.showMixedValue = property.hasMixedValue;
|
|
|
|
var mode = property.floatValue;
|
|
EditorGUI.BeginChangeCheck();
|
|
mode = EditorGUILayout.Popup(label, (int)mode, options);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
m_MaterialEditor.RegisterPropertyChangeUndo(label);
|
|
property.floatValue = (float)mode;
|
|
}
|
|
|
|
EditorGUI.showMixedValue = false;
|
|
}
|
|
|
|
public static void SetupMaterialBlendMode(Material material)
|
|
{
|
|
bool alphaClip = material.GetFloat("_AlphaClip") == 1;
|
|
if(alphaClip)
|
|
material.EnableKeyword("_ALPHATEST_ON");
|
|
else
|
|
material.DisableKeyword("_ALPHATEST_ON");
|
|
|
|
SurfaceType surfaceType = (SurfaceType)material.GetFloat("_Surface");
|
|
if(surfaceType == SurfaceType.Opaque)
|
|
{
|
|
material.SetOverrideTag("RenderType", "");
|
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
|
|
material.SetInt("_ZWrite", 1);
|
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
|
material.renderQueue = -1;
|
|
material.SetShaderPassEnabled("ShadowCaster", true);
|
|
}
|
|
else
|
|
{
|
|
BlendMode blendMode = (BlendMode)material.GetFloat("_Blend");
|
|
switch (blendMode)
|
|
{
|
|
case BlendMode.Alpha:
|
|
material.SetOverrideTag("RenderType", "Transparent");
|
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
|
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
|
|
material.SetInt("_ZWrite", 0);
|
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
|
material.SetShaderPassEnabled("ShadowCaster", false);
|
|
break;
|
|
case BlendMode.Premultiply:
|
|
material.SetOverrideTag("RenderType", "Transparent");
|
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
|
|
material.SetInt("_ZWrite", 0);
|
|
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
|
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
|
material.SetShaderPassEnabled("ShadowCaster", false);
|
|
break;
|
|
case BlendMode.Additive:
|
|
material.SetOverrideTag("RenderType", "Transparent");
|
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
|
material.SetInt("_ZWrite", 0);
|
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
|
material.SetShaderPassEnabled("ShadowCaster", false);
|
|
break;
|
|
case BlendMode.Multiply:
|
|
material.SetOverrideTag("RenderType", "Transparent");
|
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor);
|
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
|
|
material.SetInt("_ZWrite", 0);
|
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
|
material.SetShaderPassEnabled("ShadowCaster", false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected MaterialEditor m_MaterialEditor;
|
|
private bool m_FirstTimeApply = true;
|
|
}
|