Shader的Properties在Shader的渲染管道中是非常重要的,它是艺术家和用户指定纹理Texture和调整Shader值的手段。

Properties允许在Material的Inspector标签中显示GUI元素,而不用我们使用其他编辑器来修改,这提供给我们一个很直观的修改方法。

在MonoDevelop中打开上一节的Shader,在第2-4行,我们称这里为Properties块,现在它又一个属性叫做_MainTex。如果你查看使用这个Shader的Material,你会注意到在Inspector标签有一个叫做Texture的GUI元素。这些代码就在为我们创建了这个GUI。




下面我们在BaseDiffuse的Shader中创建Properties学习新的语法来看看它是怎么工作的:

  1. 在Properties块我们删除下面的代码


    _MainTex ("Base (RGB)", 2D) = "white" {}


  2. 输入下面的代码,保存,然后进入Unity Editor


    _EmissiveColor ("Emissive Color", Color) = (1,1,1,1)


  3. 当你回到Unity,Shader会被编译,在Material的Inspector标签可以看到一个color选区界面叫Emissive Color替换掉了之前的Texture,我们再添加一个看看会发生什么。


    _AmbientColor ("Ambient Color", Color) = (1,1,1,1)


  4. 现在我们创建一个其他类型的属性,输入下面的代码


    _MySliderValue ("This is a Slider", Range(0,10)) = 2.5


  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中使用属性

关于属性的更多信息可以查看官方文档:



IMAKIBA

Welcom to my blog!