着色器在Properties代码块中声明 材质球的各种特性。如果你想要在着色器程序中使用这些特性,你需要在CG/HLSL中声明一个变量,这个变量需要与你要使用的特性拥有同样的名字和对的上号的类型。比如以下这些类型:
_MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float", Float) = 0.5 _MyTexture ("Texture", 2D) = "white" {} _MyCubemap ("Cubemap", CUBE) = "" {}
在CG/HLSL代码中,要使用他们,就需要声明如下变量:
fixed4 _MyColor; float4 _MyVector; sampler2D _MyTexture; sampleCUBE _MyCubemap;
属性的值如何提供给着色器
在这些地方找到着色器属性值并提供给着色器:
- 在材质特性区域设置的每个渲染器值。这个是典型的“每个实例”型数据(一堆共享一个材质球的物体,却可以单独定制各自的颜色)
- 在被渲染的物体上的材质的设置值。
- 全局着色器属性,要么通过unity自带渲染代码,要么从你自己的代码中获取。
上面三点的优先级顺序为:实例属性值覆盖所有值;然后是材质数据被使用;最后如果着色器属性在这两者(实例、材质球数据)中都不存在,那么使用全局属性。最后,如果着色器中没有属性定义,那么“缺省”(float是0,颜色是黑色,贴图是空的白图)值被使用。
序列化和运行时 材质球属性
材质球可以包含 序列化的和运行时设置的属性值。
序列化数据是定义在shader 属性代码块中的所有数据。通常来说,这些值需要被存储在材质球中,并且用户可以在Inpsector面板中编辑他们。
一个材质球也可以有一些没有被定义在 属性代码块中,但是也可以被shader使用的属性。典型的案例是这些属性是在运行时通过脚本设置的。比如 Material.SetColor.注意矩阵和数组都只能存在于非序列化的运行时属性中。(因为属性块中没法定义矩阵与数组)。
特别的贴图属性
对于每一个被设置为 shader/材质球的 属性的贴图,unity也设置了一些额外的信息到额外的向量属性中去。
Texture tiling & offset
材质球的贴图属性中通常都有缩放和偏移量字段。这个信息是通过一个float4{TextureName}_ST传给着色器的;
属性:
- x 包含 X 方向缩放值
- y 包含 Y方向缩放值
- z 包含 X 偏移量值
- w 包含Y 偏移量值
举个例子,如果一个着色器抱哈一个叫_MainTex的贴图,它的缩放信息就会存储在 _MainTex_ST向量中。
Texture size
{TextureName}_TexelSize - 一个float4属性包含了贴图的尺寸信息:
- x 包含 1.0/宽度
- y 包含 1.0/高度
- z 包含 宽度
- w 包含 高度
Texture HDR 参数
{TextureName}_HDR - 根据所使用的颜色空间,一个float4属性包含如何解码潜在HDR(例如rgbm编码)纹理的信息。
Color space and color/vector shader data
当使用 线性颜色空间,所有的材质球颜色属性都提供的是sRGB颜色,但是会转换为线性值再传递给着色器。
比如,如果你的 着色器属性代码块包含一个颜色 属性,叫做“MyColor”,然后对应的“MyColor” HLSL变量将会得到这个颜色的线性值。
对于那些被标记为Float 或者Vertor的类型属性,默认情况下没有颜色空间转换;它们被假定不包含颜色信息。给float/vector属性加上[Gamma]特性,然后用来表明它们是特别的sRGB 空间,就像这样是可以的。