这篇开始主要介绍ShaderLab的语法,参考资料主要来自官方手册。html
如前所述,Unity中的全部Shaders都是用“ShaderLab”这种声明式语言(Declarative programming)编写的。真正的“shader code”写在同一shader文件的CGPROGRAMsnippets内。CGPROGRAM snippets 是用通用的 HLSL/Cg 语言编写的。编辑器
Properties { Property [Property ...] }ide
格式
_Name(“Display Name”,type) = defaultValue{options}
属性名(“显示名”,类型) = 默认值 {可选参数}函数
数字和滑动条
Float、Int、Range (min, max)
这些都使用默认值定义了数字属性。 Range格式会显示一个min到max的滑动条。spa
name ("display name", Range (min, max)) = number
name ("display name", Float) = number3d
Colors and Vectors
定义一个RGBA颜色,或者一个4D向量属性。code
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)orm
Textures
定义一个2D texture, cubemap or 3D (volume) 属性。htm
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}ip
细节
每一个属性都是根据name引用的(在Unity中通常如下划线_开始),而在编辑器界面显示的是display name,等号后面指定了默认值:
以后在shader的fixed function部分,属性值能够经过方括号加属性名获取:[name]。
Properties块中的属性会被序列化成material数据,这对于在脚本控制值很是有用 (使用 Material.SetFloat 或相似函数).
Property attributes and drawers
对以前的属性,均可以使用方括号指定可选的修饰(attributes),下面是一些Unity能够认出的修饰,或是能够本身指定(MaterialPropertyDrawer classes) 以控制它们在material inspector中如何被渲染。
- [HideInInspector] 不在inspector显示