US5L4——ToggleDrawer
US5L4——ToggleDrawer
本章代码关键字
1 | [Toggle] // 将float数据以开关的形式在材质属性面板上显示 |
自带Shader材质属性绘制类
通过之前的学习,我们知道通过继承 MaterialPropertyDrawer
(材质属性绘制器)实现的类,可以自定义 Shader 属性在 Inspector 窗口的外观
而自带 Shader 材质属性绘制类指的就是 Unity 内部实现好的继承自 MaterialPropertyDrawer
(材质属性绘制器)的绘制类
可以让我们在 Shader 属性语句块中直接使用,让属性在Inspector窗口中具备特殊样式,方便我们进行材质球参数设置
ToggleDrawer
作用:将 float
数据以开关的形式在材质属性面板上显示,数值只能设置为 0 或 1,0 为关闭,1 为开启
使用场景:
- 开启或关闭某个特效(比如是否启用边缘)
- 切换某些功能(比如是否使用纹理颜色)
- 控制条件分支逻辑
等等
用法:在属性语句块中声明属性时,在属性前加上 [Toggle]
或 [Toggle(自定义关键词名)]
1 | [Toggle] _属性名("属性名", Float) = 0 或 1 |
使用示例(使用 if
语句在运行时动态切换分支逻辑):
1 | Shader "TeachShader/Lesson130" |
显示效果:
ToggleDrawer 关联关键字
ToggleDrawer
可以和关键字编译指令结合使用,达到在材质面板中通过 Toggle
禁用启用关键字的效果,从而切换功能或者特效等
它可以让开发者在材质球的 Inspector 窗口中通过简单的复选框启用或者禁用关键字
让 ToggleDrawer
控制关键字的启用或禁用,需要执行以下两个步骤:
-
ToggleDrawer
和关键词绑定当我们使用
Toggle
定义一个Float
属性时,Unity 会自动根据属性值设置全局关键词举例:
[Toggle] _ShowTex("ShowTex", Float) = 0或1
默认生成的全局关键词为
_SHOWTEX_ON
(勾选时为 1 时激活),我们也可以利用Toggle
自定义关键词名[Toggle(自定义关键词名)]
-
关键词连接
可以使用
#pragma shader_feature
或#pragma multi_compile
来关联关键词
当我们在材质面板切换Toggle
时,Unity 会启用或禁用对应的关键词,触发对应的 Shader 变体注意:编译指令声明的关键词必须与
ToggleDrawer
的关键词一致,才能正确切换功能1
2
3
4
5Properties
{
_MainTex ("Texture", 2D) = "white" {}
[Toggle] _ShowTex("ShowTex", Float) = 1 // 默认会有一个关键字 _SHOWTEX_ON
}1
2
3
4
5
6
7
8
9CGPROGRAM
// make fog work
// 如果_ShowTex在材质面板被激活,则这里声明的关键字也会被激活
//...
ENDCG1
2
3
4
5
6
7
8
9
10
11
12
13
14
15fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = fixed4(0, 0, 0, 0);
col = tex2D(_MainTex, i.uv);
col = fixed4(1,1,1,1);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}使用自定义关键词的情况:
1
2
3
4
5Properties
{
_MainTex ("Texture", 2D) = "white" {}
[Toggle(_CUSTOM_KEYWORD)] _ShowTex("ShowTex", Float) = 1
}1
2
3
4
5
6
7
8
9CGPROGRAM
// make fog work
// ...
ENDCG1
2
3
4
5
6
7
8
9
10
11
12
13
14
15fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = fixed4(0, 0, 0, 0);
col = tex2D(_MainTex, i.uv);
col = fixed4(1,1,1,1);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
使用示例(使用不同的 Shader 变体去执行不同分支逻辑):
1 | Shader "TeachShader/Lesson130" |
显示效果: