Shaders可以定义一个参数列表,让设计师可以在Unity的material inspector中设置。Shader文件的Properties代码块是用来定义它们的。
Properties { Property [Property ...] }
定义property代码块。 括号内的属性定义如下。
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
它们都定义了一个数值(标量) property 作为默认值。Range
格式让其显示为一个滑块,可在min与max值之间滑动。
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
用所给的RGBA组件定义一个有默认值的颜色属性,或者定义一个有默认值的4D向量属性。颜色 properties 会有颜色拾取器, 并根据色彩空间的需要进行调整 (see Properties in Shader Programs)。 向量属性展示为4个数字变量。
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}
分别定义了一个 2D texture, cubemap 或 3D (volume) 属性。
在shader中的每个property,都是靠 name来引用的(在Unity中,用下划线开头的shader property名称是很常见的。)。属性会以display name显示在材质的inspector面板中。每个属性都要给予一个默认值在等号后:
然后在固定管线部分,property值可以直接通过方括号中的name来访问: [name]. 例如,你可以使混合模式通过一个材质属性驱动,通过定义两个 integer properties(名为 “SrcBlend“ 和 ”DstBlend”), 然后让 Blend Command 使用它们: Blend [_SrcBlend] [_DstBlend]
.
Properties
块中的着色器参数被序列化为Material数据。 Shader programs 其实可以拥有更多参数(比如 matrices, vectors and floats )它们被代码在运行中设置到材质里,但是如果它们不是Properties块的一部分,那么它们的值将不会被保存下来。这对于那些完全由脚本代码驱动的值非常有用 (使用 Material.SetFloat 和其他类似函数).
Property前的方括号内的属性是可以指定的。 这些属性被Unity识别或由您自定义的MaterialPropertyDrawer classes识别来控制property会如何渲染到material inspector。被Unity定义的属性:
[HideInInspector]
- 不在material inspector中显示property的值。[NoScaleOffset]
- material inspector将不会显示被该属性标记的纹理的tiling/offset变量。[Normal]
- 标示该纹理应该为法向贴图。[HDR]
- 标示纹理属性应该为高动态范围(HDR)纹理。[Gamma]
- 标示一个float/vector property在UI中是被指定为sRGB值的(就和color值一样,通过color picker赋值?), 并可能需要根据使用的色彩空间转换. See Properties in Shader Programs.[PerRendererData]
- 标示纹理将来自格式为 MaterialPropertyBlock的per-renderer data. Material inspector changes the texture slot UI for these properties.// properties for a water shader
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
在Unity 5之前,纹理属性可以在卷括号中选择, 例如 TexGen CubeReflect。 它们都是用了控制固定管线纹理坐标生成的。 这些函数在 5.0 中被移除了; 如果你需要 texgen 你应该写一个 vertex shader 代替。 到 Implementing Fixed Function TexGen page 页面查看例子。