|
本文永久地址:http://www./article/25.aspx,【文章轉(zhuǎn)載請(qǐng)注明出處!】
一、Unity 中三種著色器書寫格式:
1、surface shaders, 表面著色器
2、vertex and fragment shaders and 頂點(diǎn)和片段著色器
3、fixed function shaders. 固定功能著色器
二、頂點(diǎn)著色器與片段著色器
三維空間中任何復(fù)雜的模型都是由若干個(gè)三角形組成的,頂點(diǎn)(Vertex)就是指這些三角形的頂點(diǎn),而片段(fragment)就是指三角形的填充區(qū)域。
三、表面著色器(Surface Shader)的標(biāo)準(zhǔn)輸出結(jié)構(gòu):
struct SurfaceOutput
{
half3 Albedo; //反射率
half3 Normal; //法線
half3 Emission; //自發(fā)光,用于增強(qiáng)物體自身的亮度,使之看起來(lái)好像可以自己發(fā)光
half Specular; //鏡面
half Gloss; //光澤
half Alpha; //透明
};
四、表面著色器使用 #pragma surface surfaceFunction lightModel [optionalparams] 指令,以聲明它是一個(gè)表面著色器。
1、surfaceFunction:表示Cg函數(shù)中有表面著色器(surface shader)代碼。這個(gè)函數(shù)的格式應(yīng)該是這樣:void surf (Input IN,inout SurfaceOutput o), Input是你自己定義的結(jié)構(gòu)。Input結(jié)構(gòu)中應(yīng)該包含所有紋理坐標(biāo)(texture coordinates)和和表面函數(shù)(surfaceFunction)所需要的額外的必需變量。
2、lightModel:在光照模式中使用。內(nèi)置的是Lambert(diffuse)和 BlinnPhong(specular)。
五、表面著色器附加輸入結(jié)構(gòu):
1、float3 viewDir:視圖方向(view direction) 值。為了計(jì)算視差效果(Parallax effects),邊緣光照(rim lighting)等,需要包含視圖方向(view direction)值。
2、float4 COLOR:每個(gè)頂點(diǎn)(per-vertex)顏色的插值。
3、float4 screenPos:屏幕空間中的位置。 為了反射效果,需要包含屏幕空間中的位置信息。
4、float3 worldPos:世界空間中的位置。
5、float3 worldRefl:世界空間中的反射向量。如果表面著色器(surface shader)不寫入法線(o.Normal)參數(shù),將包含這個(gè)參數(shù)。
6、float3 worldNormal:世界空間中的法線向量(normal vector)。如果表面著色器(surface shader)不寫入法線(o.Normal)參數(shù),將包含這個(gè)參數(shù)。
7、float3 worldRefl(INTERNAL_DATA):世界空間中的反射向量。如果表面著色器(surface shader)不寫入法線(o.Normal)參數(shù),將包含這個(gè)參數(shù)。為了獲得基于每個(gè)頂點(diǎn)法線貼圖( per-pixel normal map)的反射向量(reflection vector)需要使用世界反射向量(WorldReflectionVector (IN, o.Normal))。
8、float3 worldNormal(INTERNAL_DATA):世界空間中的法線向量(normal vector)。如果表面著色器(surface shader)不寫入法線(o.Normal)參數(shù),將包含這個(gè)參數(shù)。為了獲得基于每個(gè)頂點(diǎn)法線貼圖( per-pixel normal map)的法線向量(normal vector)需要使用世界法線向量(WorldNormalVector (IN, o.Normal))。
六、光照模式聲明
光照模式是一個(gè)以Lighting開(kāi)頭與名字組合在一起的合乎規(guī)范的函數(shù)。你可以在你的著色器文件(shader file)或?qū)胛募?included files)中的任何一個(gè)地方聲明它。這個(gè)函數(shù)是:
1、half4 LightingName(SurfaceOutput s, half3 lightDir, half atten):這是在正向渲染路徑(forward rendering path)中使用的光照模式。它不是取決于視圖方向的(view direction)。
2、half4 LightingName(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten):這是在正向渲染路徑(forward rendering path)中使用的光照模式。它取決于視圖的方向(view direction)。
3、half4 LightingName_PrePass(SurfaceOutput s, half4 light):這是在延時(shí)光照路徑(deferred lighting path)中使用的。
當(dāng)定向解碼光照貼圖用于向前/延遲光照中的光照函數(shù),或類似的函數(shù)中時(shí),需要進(jìn)行定制。
1、half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal):這是使用的不依賴于視圖方向(view direction)的光照模式(light model)。
2、half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor):這是使用的依賴于視圖方向(view direction)的光照模式(light model)。
|