Properties
在 shader 里可以定义一系列参数,这些参数可以在 Unity 材质面板里进行设置。在 Properties 里可定义这些参数:
Properties {
Property
[Property ...]
}
Property 的格式为:
// 变量名 Inspector显示名称 变量类型 默认值
_AmbientColor ("Ambient Color", Color) = (1, 1, 1, 1)
具体的有下面这些形式:
name("display name", Range(min, max)) = number
name("display name", Float) = number
name("display name", Int) = number
name("display name", Color) = (number, number, number, number)
name("display name", Vector) = (number, number, number, number)
name("display name", 2D) = "defaulttexture" {}
name("display name", Cube) = "defaulttexture" {}
name("display name", 3D) = "defaulttexture" {}
name
一般以下划线开始。"defaulttexture" 要么是空字符串,要么是内建默认纹理:"white", "black", "gray", "bump".
每个 Property 需要在 CG 中有对应的变量,它们名称必须相同,类型有如下的对应关系:
ShaderLab 属性类型 | CG 变量类型 | 功能 |
---|---|---|
Color | float4, half4, fixed4 | 色块,通过拾色器获取颜色 |
Vector | float4, half4, fixed4 | |
Range(min, max) | float, half, fixed | float 属性,以滑动条的形式调节 |
Float | float, half, fixed | 非滑动条的 float 属性 |
2D | sampler2D | 2D 纹理。拖拽一个纹理 |
Cube | samplerCube | 立方贴图,拖拽立方贴图 |
3D | sampler3D | 3D 纹理 |
2D 纹理属性还需要以 纹理名_ST
的方式声明一个 float4 类型的变量,xy 存储的是缩放值,zw 存储的是偏移值。
Property 还有这样一些属性:
- [HideInInspector]: 在材质面板不显示该属性值
- [NoScaleOffset]: 在材质面板不显示纹理的 tiling 和 offset 属性
- [Normal]: 指示纹理需要一张法线贴图
- [HDR]: 指示纹理需要一张 HDR 纹理
- [Gamma]: 指示 float/vector 属性是一个 sRGB 值
- [PerRendererData]
Property 前面还可以加上 [Enum]
参数,以在 inspector 面板中显示单选下拉框,例如:
[Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0
这样 inspector 里的 Smoothness texture channel 就会是由 Metallic Alpha 和 Albedo Alpha 两项组成的单选下拉框,分别表示0和1。
Unity 5 里新增了 [KeywordEnum]
参数,也用于在面板中显示单选下拉框,但用法有所区别:
[KeywordEnum(None, Add, Multiply, Screen)] _BlendMode ("Blend Mode", Int) = 0
KeywordEnum 参数不用像 Enum 那样成对写,值为从0开始的连续整数。Enum 最多支持7对值,而 KeywordEnum 最多支持9个值。
加上 [ToggleOff]
参数,以在 inspector 面板中显示复选框,例如:
[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0