Unity Shader(二)

細說一下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

屬性的類型,常用的有以下幾種:

  1. Color顏色

  2. Int整數

  3. Float浮點數

  4. Vector四維數

  5. 2D紋理

  6. 3D紋理

  7. 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。

  1. Tiling (貼圖重複度)

  2. Offset (貼圖偏移值)

如需讓這兩組值產生作用,我們需要在Shader中添加一些代碼以支持,在後續文章中會講解。

如果我們不希望用戶去調節此參數,或者爲了使性能極致化,我們可以考慮把它們的代碼功能移除掉,但一旦如此,材質面板中的參數將不起作用,這時我們就可以使用[NoScaleOffset]屬性標記來將它們隱藏掉。

[Normal]

	Properties
	{
		[Normal]_MainTex("我是2D紋理", 2D) = "white" {}
	}

如果我們希望用戶指定貼圖時選擇法線,那我們要怎麼辦呢,我們並不能控制用戶會選擇什麼類型的貼圖。

此時我們可以通過添加[Normal],來標記此屬性是用來接收法線貼圖的,當用戶指定了非法線的貼圖時會在材質面板上進行警告提示:

有一點一定要注意,有時美術在其它軟件中導出了法線貼圖,但在Unity直接拖上來還是會有警告提示,是因爲沒有在貼圖導入面板中把Texture Type設置爲Normal,只有這樣這張貼圖纔會被Unity識別爲法線。

默認值

2D紋理的默認值有以下幾種:

  1. white

  2. black

  3. gray

  4. 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]

在材質面板中隱藏此條屬性,在不希望暴露某條屬性時可以快速將其隱藏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章