Shader的Properties在Shader的渲染管道中是非常重要的,它是艺术家和用户指定纹理Texture和调整Shader值的手段。
Properties允许在Material的Inspector标签中显示GUI元素,而不用我们使用其他编辑器来修改,这提供给我们一个很直观的修改方法。
在MonoDevelop中打开上一节的Shader,在第2-4行,我们称这里为Properties块,现在它又一个属性叫做_MainTex。如果你查看使用这个Shader的Material,你会注意到在Inspector标签有一个叫做Texture的GUI元素。这些代码就在为我们创建了这个GUI。
下面我们在BaseDiffuse的Shader中创建Properties学习新的语法来看看它是怎么工作的:
-
在Properties块我们删除下面的代码
_MainTex ("Base (RGB)", 2D) = "white" {}
-
输入下面的代码,保存,然后进入Unity Editor
_EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
-
当你回到Unity,Shader会被编译,在Material的Inspector标签可以看到一个color选区界面叫Emissive Color替换掉了之前的Texture,我们再添加一个看看会发生什么。
_AmbientColor ("Ambient Color", Color) = (1,1,1,1)
-
现在我们创建一个其他类型的属性,输入下面的代码
_MySliderValue ("This is a Slider", Range(0,10)) = 2.5
-
我们创建了新的GUI元素来与我们的Shader直观的交互,我们新建的Slider叫做This is a Slider,如下图所示
Properties允许你以直观的方式来调整Shader而不需要编写代码来改变Shader。
每一个Unity Shader都有一个内建结构来寻找它的代码。Properties是Unity预设的功能之一。下面给出这样做的原因:
Shader程序员创建一个GUI元素直接与Shader代码进行绑定。Properties块中定义的属性可以用来改变Shader的值,颜色和纹理(Texture)。
我们来看看它在后面到底做了些什么。
当你添加一个属性时,你需要指定一个Variable Name。Variable Name是Shader代码用来从GUI元素中取值。这省了我们不少时间。
属性的下一个元素是Inspector GUI Name和属性的类型(Type)。他们是成对出现的。Inspector GUI Name是Material的Inspector中显示的名称,Type是用来控制数据的类型。在Unity Shader中有许多类型可定义。下面的表格介绍了在Shaders中使用的数据类型:
Range (min, max)
创建一个Float属性Slider值在min与max之间
Color
在Inspector标签中创建一个Color拾取器给定默认值=(float,float,float,float)
2D
创建一个纹理拾取器,允许用户拖拽纹理到Shader
Rect
创建一个非二次幂纹理(non-power-of-2 texture )拾取器,功能和2D GUI一样
Cube
创建一个立方体纹理(cube map eg:世界立方体纹理)拾取器,允许用户拖立方体拽纹理到Shader
Float
创建一个Float属性但是没有Slider
Vector
创建一个4个Float属性,允许你创建方向或颜色
最后,属性都可以设置默认值。在前面的例子中我们为_AmbientColor,类型为Color设置了一个(1,1,1,1)的默认值。这是一个颜色的值可以是RGBA或Float4或r,g,b,a = 1,1,1,1。当它被创建就被设置为白色。
即使添加了属性在Unity Editor中编辑发现物体并没有变化,这是因为在Shader中没有使用到这些属性,下一节我们将讲解如何在Shader中使用属性
关于属性的更多信息可以查看官方文档: