這篇開始主要介紹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顯示