1.3 为表面着色器添加属性
着色器的属性在渲染管道过程里是很重要的,因为它们是一个接口可以让使用着色器的美工或用户指定纹理和调整着色器的值。属性可以作为GUI元素暴露在材质的Inspector面板上,而不需要单独的编辑器,它提供了可视化的方法供你调整着色器。
使用MonoDevelop打开你的着色器,查看第3行到第6行的代码。这些就是着色器的Properties块,目前,它只有一个名为_MainTex的属性。如果你查看对应的材质,你会注意到Inspector面板上有个对应的纹理GUI元素,这就是使用我们的代码自动生成的。
需要再次说明的是,Unity采用高效的编码方式实现这一过程,它花费一定的时间量通过遍历来改变属性值。
1.3.1 如何操作
让我们通过创建自己的着色器属性,来了解BasicDiffuse着色器的语法以及它是如何工作的。
5.现在我们已经创建了另一种GUI元素,在Inspector面板上我们可以很直观地进行交互。这次我们创建的是一个滑动条(Slider),如下图所示。
属性可以让你创建一个可视化面板来调整着色器,而不需要更改着色器代码。
1.3.2 如何操作
每个Unity着色器都拥有一个内置结构(在它的代码中我们可以看到),这些Properties块也是Unity所希望带给你的功能之一。这样做的原因是希望给用户提供一种快捷方式来创建GUI元素并和着色器代码绑定。在Properties块中声明的属性可以在接下来的代码里用于调整值、颜色或者纹理。
让我们来看看Unity着色器在背后都做了哪些工作,当你第一次添加一个新属性时,你需要赋予它一个变量名,这个名字可以让你的着色器代码从GUI元素中获取相应的属性值,这为我们节省了大量的时间,因为我们不需要亲自建立这个系统。
属性的下一个元素就是GUI Inspector面板的名字和属性类型,它们包含在圆括号当中。GUI Inspector面板的名字就是出现在材质Inspector面板里的属性名字,它是用于与着色器交互和调整着色器的。属性的数据类型是由我们控制的。Unity提供了很多类型让我们在着色器里使用,下表描述了这些类型:
表面着色器的属性类型
最后,这些属性都有各自的默认值,代码里的属性会被快速赋予默认值。因此,在示例里,由于_AmbientColor的类型是Color,所以默认值被设为 1, 1, 1, 1。这四个值代表RGBA 或者float4,或者r, g, b, a = x, y, z,w,当它在第一次创建后,就被设置为白色。