Unity

Unity

官方網站:點擊進入
官方粉絲團:點擊進入

《Unity》Shader 01: 從頭學起

【unity】 【shader】 【渲染】
作者:Hui-Ku Shih 時間:2015-10-13
原文:Unity3D Shader 01: 從頭學起吧~_

  這是Unity3D shader 教程的第一篇,個人在不參考其他中文著作下憑著這幾年來在Unity 上的經驗所寫成。如有錯誤或是直得討論的或是問題可以直接留言討論。好~不費話,我們開始。(如果此系列教程,有檔人財路之嫌,請多多原諒,如果有老師想用於課堂之用,請先與我聯絡)

 

  Unity Shader, 其實大家都知道是基於CG 和 Fixed pipeline function. 然後統包在shader lab 的架構下,換言之,你可以用shader lab 得syntax 寫CG, Fixed Function, 和 surface shader. 所以這裡你可以知道一件事情,shader lab 是寫Unity shader 得語言。而這個語言是一種宣告式編程(REF),這種語言的特色是告訴電腦需要計算「什麼」而不是「如何」去計算。簡單來說,你在shader lab中找不到所謂的程式進入點(void main()....之類的),多半的目的是算出最後該像素的顏色值(RGBA),所以,在shader lab Debug 的時候,多半是從結果往回追code得,除此之外幾乎沒其他辦法(shader debug 很痛苦滴)。Shader Lab 的架構在Unity 的官方網站其實就

 

Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }

 

一行以蔽之 (當然後面有很多細節描述)  

我們把這行拆成幾部份來看:  

 

Shader "name"

 

所有Unity shader一開始就必須先說,我是shader, 我的名子是"name"。name 包括了shader得路徑 讓你在設定材質的時候可以找到他。

 

EX:  Shader "Custom/CGSample"  

上面簡單的表示了  我真正的名子是"CGSample" 而你可以在Custom類裡找到我

 

《Unity》Shader 01: 從頭學起

 

 [Properties]

 

這邊宣告了,這個shader 需要的基本公開資訊 Unity 4 之前的預設公開資訊只有兩個 Color 和 Maintex, Unity5 得預設公開資訊增加了 Glossiness 和 Metallic (根GI light model 有關)

 

EX: Properties {  _Color ("Color", Color) = (1,1,1,1)

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

_Glossiness ("Smoothness", Range(0,1)) = 0.5  

_Metallic("Metallic", Range(0,1)) = 0.0

      }

 

有加下滑線的的宣告是變數名稱,當然沒有規定一定要加,習慣上而已。括號內的字串,是對這個變數的描述,會顯式在Material 編輯器上,逗號後面接著是描述該變數的類形,最後跟在等號後面的是預設值。

(類形 Range 在editor 上代表 slider, 上下的界值在括號內)

 

接下來就是重頭戲我們可以花一輩子來討論這部分,恩一輩子........

 

Subshaders

 

Subshaders 其實根本就不sub, 因為他才是一個shader得主角。只是,你在一個shader lab syntax 中可以放入多個subshaders。

之前提到的三種shader,就是在這裡出現。所以我們來討論一下這三種shader的基本差異先。

 

首先,Fixed function shader, 基本上是運行最快的shader,早期在開發電玩主機,例如PS1,PSP, Wii....等等,shader 都是用Fixed function shader. 快的主要原因是,shader 得所有function 早就compile 好了,你只能做參數上的調整和更動,很難作計算,簡單來說,也很難達到一些效果。在iphone 3 甚至更老的 iphone 用finxed function shader 的的確確會比較快。很可惜,iPhone4以後用CG寫的shader速度也跟fixed function shader 差不多了。PC上更不用說了,根本沒差,所以用fixed function shader 的人就越來越少,你也很難找到資源,甚至在Unity 官網上也解釋得不清不楚。那為何講shader lab 的時候要拿fixed function shader 當範例? 這.....大概是結構比較簡單,能在最短的篇幅內講完上面說得那行 Shader Lab syntax.  

 

次,CG,Nvidia制定的shader 語言,Shader lab 可以把CG包起來,實際上,CG也是Unity Shader 得主要語言,而且功能強大,執行效率高,彈性大,有著無限的可能,大部分如果要寫真對平台的shader 都會用CG來寫,因應行動平台為Unity 得主要開發平台,今後的教程,盡量以CG為主。

 

最後是Unity 自己的surface shader 這個shader 不是啥特定的語言,是把CG再包一層起來的東西。非常的"通用",因此也非常得貴。Unity 在surfact shader 上著墨很多,提供了非常多的範例。但相信我,要用這東西,除了compile 成組語或是機器碼之前要先生成完整的CG shader。而這個shader 你在哪可以看到?   

 

《Unity》Shader 01: 從頭學起

 

隨便找個surface shader 然後按下"Show generated code" 你會發現裡面可能有很多你根本不會用到的東西,"通用",所以為"通用",就是因為裡面包了很多選擇可以讓你打開關掉 (這部分我們以後會談到),但最讓我不滿的是,Unity 5 得surface shader預設就包了 GI lighting model。這讓人火大.....haha.   

(小結,如果你要針對Uniyt shader作最佳化,第一件事情就是不要寫surface shader)

 

subshaders 我們先講到這就好,以後會針對CG繼續。

 

 

 [Fallback] 

 

EX: 

FallBack "Diffuse"

 

FallBack是用來宣告,如果subshader顯示卡無法成功計算結果時,代替用的shader

這行的意思是說,失敗時會用 diffuse shader 來render

 

 

[CustomEditor]

 

EX: 

CustomEditor "CustomShaderGUI"

 

最後這個部分不常見,語法上是說,這個shader 有一個指定的客制化GUI editor 她的class 名稱是 CustomShaderGUI

換言之,你必須另外實作 ShaderGUI 這個抽象類別來完成這個客制化的GUI editor。

 

這就是 shader lab 的大綱  

最後以一個最簡單的CG shader 作結  下一篇將講解基礎的CG

 

《Unity》Shader 01: 從頭學起

※作者作品

《落跑藍圖》 Android
《落跑藍圖》iOS
x