細說一下Porperties屬性部分。
Properties可以理解爲是材質與Shader的連接通道,我們在材質面板上需要設置的內容都必須通過Properties來實現並暴露。
語法格式
屬性的寫法有個通用的格式:
[Attribute]_Name ("Display Name",Type) = Default Value
-
Attribute
屬性標記,說白了就是Unity內置的幾個屬性標記關鍵字,用於對當前這條屬性進行一些特殊的處理,在下面會進行詳細介紹。
此標記不是必選項,可以不添加,同時一條屬性上也可以有多條屬性標記。
-
_Name:
屬性的名稱,也就是變量名,在Shader的CG代碼中就是通過這個名稱來調用此屬性內容的,在外部利用腳本調用時也是這個名稱,所以一定要用英文。
在名稱前一定要加上下劃線,否則會出現編繹錯誤!至於爲什麼加下劃線,沒有去細究原因,有知道的可以告知分享下〜
關於此變量名,有一點很重要!
就是如果此Shader有FallBack的話,一定要將此Shader中的變量名與FallBack中的變量名保持一致,否則會出現FallBack後原有的屬性值獲取不到的情況,切記!
-
Display Name:
顯示在材質面板上的名稱,主要起到說明解釋的作用,可中文(正式項目中建議最好還是用英文)。
建議這裏的顯示名稱要起的有意義,要知道最終在材質上調節的人很大部分情況下不會是你自己,別人更不可能知道每個屬性內部是如何關聯以及有什麼作用,所以當我們TA在做完一個Shader給到使用人員的時候,一定要給他講解一下,不管是有個說明文檔還是簡單溝通下都是有必要的。這樣才能最大發揮Shader的使用效果,所以顯示名稱起着一半說明書的作用,一定要重視。
什麼樣的名字是有意義的呢?
作用與通道的組合(在需要說明通道的情況下)。
比如:一張基礎表面色貼圖,可以用"Base (RGB)",這樣即說明了此貼圖是基本貼圖,同時又說明了此貼圖在表面色上只使用到了RGB三個通道。
Type
屬性的類型,常用的有以下幾種:
Color顏色
Int整數
Float浮點數
Vector四維數
2D紋理
3D紋理
Cube立方體紋理
每條屬性是什麼,以及在材質面板上應該顯示什麼都是由此類型來決定的,在下面會進行詳細介紹說明。
Default Value
默認值,當第一次指定此Shader時,或者在材質面板上執行Reset時,屬性的值會自動恢復到默認值,不同的類型具體寫法也不太一樣,下面會結合類型進行詳細說明。
Color(類型:顏色)
示例如下:
Properties { _Color("我是Color", Color) = (1,1,1,1) }
變量名:_Color
顯示名稱:我是Color
類型:Color
默認值:(1,1,1,1)
顏色屬性是個四維分量,也就是由四個數值來組成的,每個數值代表着顏色的一個通道。四個數值依次爲RGBA(紅,綠,藍,透明)。
RGB的取值是0-255(2的8次方個值域),而在Shader中被歸一化爲0-1間。
Shader中的浮點數值後不需要加後綴f,否則會出錯。
零點幾的值可以省略零,比如0.95可以寫成.95[HDR]
Properties { [HDR]_Color("Color", Color) = (1,1,0,1) }
當給顏色添加了HDR後,則在材質面板中的顏色上會顯示HDR的字樣。同時點擊顏色彈出來的取色器面板中也會多出一條Intensity的選項(2018.3版本,2017版本是Brightness)。
HDR可以使顏色亮度的值超過1,通過這個值可以配合鏡頭Bloom效果做出物體泛光的視覺效果。
Int(類型:整型)
示例如下:
Properties { _Int("我是Int", Int) = 1 }
變量名:_Int
顯示名稱:我是Int
類型:Int
默認值:1
雖然在材質面板中我們可以隨意輸入數值,比如0.55,但是在Shader內部它卻只能被識別爲整數。
注意,此值並不是四捨五入,而是直接取整,比如1.999,結果是1.Float(類型:浮點數)
示例如下:
Properties { _Float("我是Float", Float) = 0.5 }
變量名:_Float
顯示名稱:我是Float
類型:Float
默認值:0.5
和Int長的很像,只不過Float中支持浮點數。
在Shader中Float是最基本的類型,而Int只是一種僞整型,從Shader精度上來講並不存在整型。所以在Properties內完全可以用Float替代Int。[Range]
Properties { _Float("我是Float", Range( 0 , 1)) = 0.5 }
很常用的一種屬性標記,主要是用來將浮點數限制在一個可以通過滑動條來選擇的一個區間。
將此屬性中原有的Float替換成Range (Min,Max)即可,Min=最小值,Max=最大值。
[PowerSlider]
Properties { [PowerSlider(3)]_Float("我是Float", Range( 0 , 1)) = 0.5 }
先上張圖:
我們拿它跟上面的不加PowerSlider來對比,同樣是值0.5,在材質面板上滑桿的位置是不一樣的。
PowerSlider (Value)
其中Value的值我們可以自由定義,支持浮點數,值越大會導致滑條的曲度變化越大,值爲1時不改變。
此屬性標記的主要作用,是方便用戶調節滑桿。比如有個屬性值是從0-1,但是很大部分情況下所用到的值都是0-0.1左右,同時需要更精細的在這區間進行微調。那麼正常情況下,用戶在整個滑條上想選擇0-0.1之間本身就變的很難了,更不要說在這區間微調了。所以這個時候就可以利用PowerSlider來解決此問題。[IntRange]
Properties { [IntRange]_Float("我是Float", Range( 0 , 1)) = 1 }
加了它之後呢,你在材質面板上拖動時就只能生成整數了。所以說我們完全可以用Float來代替Int。
注意,當添加了[IntRange]後,默認值會被自動進行處理,假如默認值你寫的是0.1,則在Shader內部會自動向下取整,取值爲0.[Toggle]
開關,0代表關,1代表開,就這麼簡單。
Properties { [Toggle]_Float("我是Float", Range( 0 , 1)) = 1 }
[Enum]
枚舉,美術問:啥是枚舉呀?答:你可以理解爲就是下拉列表啦〜
Properties { [Enum(UnityEngine.Rendering.CullMode)]_Float("我是Float", Float) = 1 }
關於Toggle和Enum我們會在後續的篇章中詳細探討,到時會結合具體用法與功能再來說明,這樣比較好理解。這裏僅僅只是知道下我們可以通過Float來實現這些功能。Vector(類型:四維向量)
示例如下:
Properties { _Vector("我是Vector", Vector) = (0,0,0,0) }
變量名:_Vector
顯示名稱:我是Vector
類型:Vector
默認值:0,0,0,0
由四個Float組合而成的Vector,在材質面板中顯示的是四個數值輸入框。
四個分量分別對應XYZW,也可以叫做RGBA。
XYZW與RGBA同樣都是四個分量組合,只是在用於顏色時我們通常用RGBA來表示,用作座標時習慣用XYZW來表示而已,同樣我們也是可以用Vector來輸出顏色,只是不那麼方便直觀而已。2D(類型:2D紋理)
示例如下:
Properties { _MainTex("我是2D紋理", 2D) = "white" {} }
變量名:_MainTex
顯示名稱:我是2D紋理
類型:2D
默認值:white
紋理貼圖,也是Shader中最最常用的屬性之一。
[NoScaleOffset]
Properties { [NoScaleOffset]_MainTex("我是2D紋理", 2D) = "white" {} }
在材質面板中除了顯示貼圖槽以外默認還會顯示兩組Float。
Tiling (貼圖重複度)
Offset (貼圖偏移值)
如需讓這兩組值產生作用,我們需要在Shader中添加一些代碼以支持,在後續文章中會講解。如果我們不希望用戶去調節此參數,或者爲了使性能極致化,我們可以考慮把它們的代碼功能移除掉,但一旦如此,材質面板中的參數將不起作用,這時我們就可以使用[NoScaleOffset]屬性標記來將它們隱藏掉。
[Normal]
Properties { [Normal]_MainTex("我是2D紋理", 2D) = "white" {} }
如果我們希望用戶指定貼圖時選擇法線,那我們要怎麼辦呢,我們並不能控制用戶會選擇什麼類型的貼圖。
此時我們可以通過添加[Normal],來標記此屬性是用來接收法線貼圖的,當用戶指定了非法線的貼圖時會在材質面板上進行警告提示:
有一點一定要注意,有時美術在其它軟件中導出了法線貼圖,但在Unity直接拖上來還是會有警告提示,是因爲沒有在貼圖導入面板中把Texture Type設置爲Normal,只有這樣這張貼圖纔會被Unity識別爲法線。默認值
2D紋理的默認值有以下幾種:
white
black
gray
bump
如果不設置默認值,即=""{},則其實與="gray"{}相同。
當設置了默認值後,Shader內部會自動調用Unity內部準備的一張小圖片,white就是純白色,black就是純黑色,gray就是灰色圖,bump就是法線圖。
3D(類型:3D紋理)
示例如下:
Properties { _MainTex("我是3D紋理", 3d) = "" {} }
變量名:_MainTex
顯示名稱:我是3D紋理
類型:3d
默認值:空
3D紋理主要用在查找表或者體積數據上,默認值與2D的不同,不管如何設置都只會顯示爲灰色圖。
Cube(類型:立方體紋理)
示例如下:
Properties { _MainTex("我是Cube紋理", CUBE) = "" {} }
變量名:_MainTex
顯示名稱:我是Cube紋理
類型:CUBE
默認值:空
Cubemap是一個由六個獨立的正方形紋理組成的集合,它將多個紋理組合起來映射到一個單一紋理。
基本上說CubeMap包含6個2D紋理,這每個2D紋理是一個立方體(cube)的一個面,也就是說它是一個有貼圖的立方體。
想像成一個方形盒子被我們拆開鋪平的情景。
CubeMap通常被用來作爲具有反射屬性物體的反射源。
通用屬性標記
還有一些比較常用的屬性標記,可以用於任何屬性,下面來介紹下:
[Header]
Properties { [Header(This is Header )]_Int("我是Int", Int) = 1 _Float("我是Float", Range( 0 , 1)) = 1 }
在材質面板上進行標註,通常用作分類組別用,注意只支持英文、數字、空格以及下劃線。
[HideInInspector]
在材質面板中隱藏此條屬性,在不希望暴露某條屬性時可以快速將其隱藏。