原文地址:http://blog.sina.com.cn/s/blog_471132920101d5kh.html
引言撕捍,在Unity3d里,所有的圖形繪制都必須通過(guò)Shader拴鸵,即著色器。一般的使用過(guò)程中忌卤,我們用到的都是unity自帶的Shader,即build-in shader球碉。學(xué)習(xí)Shader后肾砂,自己寫的Shader能做出很多你想要的特殊效果,增強(qiáng)游戲的畫面表現(xiàn)盒音。例如 水的倒影。 LOGO的光影閃過(guò)等等效果等等团甲。
Shader的分類
Shader按管線分類一般分為固定渲染管線與可編程渲染管線
1)固定渲染管線 ——這是標(biāo)準(zhǔn)的幾何&光照(Transforming&Lighting)管線逾冬,功能是固定的,它控制著世界躺苦、視身腻、投影變換及固定光照控 制和紋理混合。T&L管線可以被渲染狀態(tài)控制匹厘,矩陣嘀趟,光照和采制參數(shù)。功能比較有限愈诚∷矗基本所有的顯卡都能正常運(yùn)行。
2)可編程渲染管線——對(duì)渲染管線中的頂點(diǎn)運(yùn)算和像素運(yùn)算分別進(jìn)行編程處理扰路,而無(wú)須象固定渲染管線那樣套用一些固定函數(shù)尤溜,取代設(shè)置參數(shù)來(lái)控制管線。
Unity3d的三種Shader
Unity的Shader分為三種:
(1)Fixed function shader 屬于固定渲染管線 Shader, 基本用于高級(jí)Shader在老顯卡無(wú)法顯示時(shí)的Fallback(之后有詳細(xì)介紹)汗唱。使用的是ShaderLab語(yǔ)言,語(yǔ)法與微軟的FX files 或者NVIDIA的 CgFX類似丈攒。
(2)Vertex and Fragment Shader 最強(qiáng)大的Shader類型哩罪,屬于可編程渲染管線. 使用的是CG/HLSL語(yǔ)法。
(3)Surface Shader Unity3d推崇的Shader類型巡验,使用Unity預(yù)制的光照模型來(lái)進(jìn)行光照運(yùn)算际插。使用的也是CG/HLSL語(yǔ)法。
Unity3d三種Shader對(duì)比
三種Shader共同點(diǎn):
(1)都必須從唯一一個(gè)根Shader開始
(2)Properties參數(shù)部分显设,作用及語(yǔ)法完全相同
(3)具體功能都在SubShader里(Subshader: 子Shader,Shader會(huì)自上而下運(yùn)行第一個(gè)硬件能支持的Subshader框弛,主要作用是對(duì)不用硬件的支持。)
(4)都可以打標(biāo)簽捕捂,例如Tags { "RenderType" = "Opaque" } LOD 200 以及Lighting On等
(5)都可以Fallback
(6)都可以處理基本的功能瑟枫,例如光照漫反射(Diffuse)以及鏡面反射(Specular)。但是Vertex and Fragment和Surface都能實(shí)現(xiàn)Fixed function實(shí)現(xiàn)不了的高級(jí)功能指攒,例如基于uv計(jì)算的效果等等慷妙。
三種Shader不同點(diǎn):
(1)Fixed function shader以及Vertex and Fragment Shader在subshader下面還有pass{},但是Surface Shader,由于已經(jīng)將具體內(nèi)容打包在光照模型了允悦,不能加pass{},加了會(huì)報(bào)錯(cuò)膝擂。
(2)Fixed function shader每句代碼之后沒有分號(hào)';' 但是V&F shader以及Surface shader每句代碼之后都必須加分號(hào)';'
(3)核心結(jié)構(gòu)不同:
Fixed function shader的核心是
Material{} 以及 SetTexture[_MainTex]{}
Vertex and Fragment Shader的核心是
CGPROGRAM
pragma vertex vert
pragma fragment frag
include "UnityCG.cginc"
ENDCG
Surface Shader的核心是
(1)這套用的是Unity3d自帶光照模型Lambert,也不做頂點(diǎn)處理,那么只需要一個(gè)表面處理函數(shù)surf即可
CGPROGRAM
pragma surface surf Lambert
ENDCG
或者(2)這套表示使用的是自己寫的光照模型lsyLightModel架馋,并且使用了頂點(diǎn)處理函數(shù)vert
CGPROGRAM
// surface 表面處理函數(shù) 光照模型函數(shù) 頂點(diǎn)處理:函數(shù)
pragma surface surf lsyLightModel vertex:vert
//執(zhí)行順序 頂點(diǎn)處理函數(shù) -> 表面處理函數(shù) -> 光照模型函數(shù) ->顏色值
ENDCG