此系列為本人學(xué)習(xí)Unity Shader的隨筆記錄:
Shader和Material
Shader(著色器)實際上就是一小段程序,它負(fù)責(zé)將輸入的Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或顏色等組合輸出。繪圖單元依據(jù)這個輸出將圖像繪制到屏幕上。
Material(材質(zhì))輸入的貼圖或顏色等,加上對應(yīng)的Shader和其參數(shù)設(shè)置,打包存儲,得到的就是一個Material。之后便可以將材質(zhì)給予合適的renderer(渲染器)來進行渲染(輸出)了。
Shader按管線分類
固定渲染管線 - 這是標(biāo)準(zhǔn)的幾何&光照(Transforming&Lighting)管線,功能是固定的,它控制著世界、視、投影變換及固定光照控 制和紋理混合。T&L管線可以被渲染狀態(tài)控制,矩陣,光照和采制參數(shù)。功能比較有限?;舅械娘@卡都能正常運行。
可編程渲染管線 - 對渲染管線中的頂點運算和像素運算分別進行編程處理,而無須象固定渲染管線那樣套用一些固定函數(shù),取代設(shè)置參數(shù)來控制管線。
Unity中Shader的程序結(jié)構(gòu)

參照圖1所示,首先是著色器名,其次屬性定義,用來指定輸入?yún)?shù)。接下來是一個或多個子著色器,在實際運行中,由運行的平臺決定的使用哪個進行渲染。子著色器是代碼的主體,每個子著色器中包含一個或者多個的Pass。在計算著色時,平臺優(yōu)先選擇可以使用的著色器,然后依次運行其中的Pass,得到輸出結(jié)果。最后指定一個回滾,用來處理所有SubShader都不能運行的情況(目標(biāo)平臺有SubShader不支持的特性)。在實際開發(fā)時,我們將直接在SubShader這個層次上寫代碼,系統(tǒng)會把我們的代碼編譯成若干個合適的Pass。
Unity支持的三種Shader
固定渲染管線著色器(Fixed function shader)- 基本用于在老顯卡無法顯示時的Fallback。使用的是ShaderLab語言,語法與微軟的FX files或者NVIDIA的 CgFX類似。
片段著色器(Fragment Shader) - 最強大的Shader類型,屬于可編程渲染管線,使用CG/HLSL語法??梢栽诒容^低的層級上進行更復(fù)雜(或者針對目標(biāo)設(shè)備更高效)的開發(fā)。
表面著色器(Surface Shader) - Unity3d推崇的Shader類型,為你做了大部分的工作,只需要簡單的技巧即可實現(xiàn)很多不錯的效果。使用Unity預(yù)制的光照模型來進行光照運算,使用CG/HLSL語法。
入門系列將主要集中在表面著色器上(Surface Shader)的介紹上。