此系列為本人學(xué)習(xí)Unity Shader的隨筆記錄:
Shader和Material
Shader(著色器)實(shí)際上就是一小段程序,它負(fù)責(zé)將輸入的Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或顏色等組合輸出。繪圖單元依據(jù)這個(gè)輸出將圖像繪制到屏幕上。
Material(材質(zhì))輸入的貼圖或顏色等挠乳,加上對(duì)應(yīng)的Shader和其參數(shù)設(shè)置,打包存儲(chǔ),得到的就是一個(gè)Material侄非。之后便可以將材質(zhì)給予合適的renderer(渲染器)來(lái)進(jìn)行渲染(輸出)了蕉汪。
Shader按管線分類
固定渲染管線 - 這是標(biāo)準(zhǔn)的幾何&光照(Transforming&Lighting)管線,功能是固定的逞怨,它控制著世界者疤、視、投影變換及固定光照控 制和紋理混合叠赦。T&L管線可以被渲染狀態(tài)控制驹马,矩陣,光照和采制參數(shù)除秀。功能比較有限糯累。基本所有的顯卡都能正常運(yùn)行鳞仙。
可編程渲染管線 - 對(duì)渲染管線中的頂點(diǎn)運(yùn)算和像素運(yùn)算分別進(jìn)行編程處理寇蚊,而無(wú)須象固定渲染管線那樣套用一些固定函數(shù),取代設(shè)置參數(shù)來(lái)控制管線棍好。
Unity中Shader的程序結(jié)構(gòu)
參照?qǐng)D1所示仗岸,首先是著色器名,其次屬性定義借笙,用來(lái)指定輸入?yún)?shù)扒怖。接下來(lái)是一個(gè)或多個(gè)子著色器,在實(shí)際運(yùn)行中业稼,由運(yùn)行的平臺(tái)決定的使用哪個(gè)進(jìn)行渲染盗痒。子著色器是代碼的主體,每個(gè)子著色器中包含一個(gè)或者多個(gè)的Pass低散。在計(jì)算著色時(shí)俯邓,平臺(tái)優(yōu)先選擇可以使用的著色器,然后依次運(yùn)行其中的Pass熔号,得到輸出結(jié)果稽鞭。最后指定一個(gè)回滾,用來(lái)處理所有SubShader都不能運(yùn)行的情況(目標(biāo)平臺(tái)有SubShader不支持的特性)引镊。在實(shí)際開(kāi)發(fā)時(shí)朦蕴,我們將直接在SubShader這個(gè)層次上寫(xiě)代碼,系統(tǒng)會(huì)把我們的代碼編譯成若干個(gè)合適的Pass弟头。
Unity支持的三種Shader
固定渲染管線著色器(Fixed function shader)- 基本用于在老顯卡無(wú)法顯示時(shí)的Fallback吩抓。使用的是ShaderLab語(yǔ)言,語(yǔ)法與微軟的FX files或者NVIDIA的 CgFX類似。
片段著色器(Fragment Shader) - 最強(qiáng)大的Shader類型,屬于可編程渲染管線擂煞,使用CG/HLSL語(yǔ)法◎拘兀可以在比較低的層級(jí)上進(jìn)行更復(fù)雜(或者針對(duì)目標(biāo)設(shè)備更高效)的開(kāi)發(fā)挣饥。
表面著色器(Surface Shader) - Unity3d推崇的Shader類型,為你做了大部分的工作沛膳,只需要簡(jiǎn)單的技巧即可實(shí)現(xiàn)很多不錯(cuò)的效果。使用Unity預(yù)制的光照模型來(lái)進(jìn)行光照運(yùn)算汛聚,使用CG/HLSL語(yǔ)法锹安。
入門(mén)系列將主要集中在表面著色器上(Surface Shader)的介紹上。