在 Unity 编辑器 (Editor) 中,在材质检视面板中查看材质时,可以启用和禁用其本地着色器关键字。它之所以有用,有两个原因:
[KeywordEnum] MaterialPropertyDrawer 启用关键字时,Unity 会自动禁用一个组集中的其他关键字。这样可以确保在任何时候仅启用一组关键字中的一个。与任何着色器设置或数据一样,仅当着色器关键字在着色器源文件中声明为材质属性时,这些关键字才在材质检视面板 (Inspector) 中可用。
对于在 Shader Graph 中创建的着色器,默认情况下,关键字是材质属性。这意味着这些设置会在材质检视面板中自动可用。要更改此属性,请打开黑板 (Blackboard),然后更改 Exposed 属性。
对于手动编码的着色器,必须确保__ ShaderLab__Unity 用于定义着色器对象结构的语言。更多信息
See in Glossary 代码定义了表示关键字集的材质属性。材质属性必须是 Float 类型,并且必须使用 [Toggle]、[ToggleOff] 或 [KeywordEnum] MaterialPropertyDrawer 属性才能将其正确暴露给检视面板。
以下示例添加了一个名为 Make Red 的开关,用于启用和禁用关键字 _RED_ON。
Shader "Unlit/ToggleRed"
{
Properties
{
[Toggle] _RED ("Make red", Float) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// Add the keyword RED_ON, for when the toggle is on
// Unity automatically adds a keyword for when the toggle is off
#pragma shader_feature _RED_ON
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// Return red if the toggle is on
#if _RED_ON
return fixed4(1, 0, 0, 1);
#else
return fixed4(0, 0, 0, 1);
#endif
}
ENDCG
}
}
}
有关更多信息和示例,请参阅 MaterialPropertyDrawer API 的文档。