Unity3D內置了很多Shader,文檔很詳細,自己翻一下.便於加深印象.
首先先解釋下Unity3D的Shader.Unity里面的Shaders是使用一種叫ShaderLab的語言編寫的,它同微軟的.FX文件或者NVIDIA的CgFX有些類似。傳統意義上的vertex shader和pixel shader 還是使用標准的Cg/HLSL 編程語言編寫的。(因此Unity文檔里面的Shader,都是指用ShaderLab編寫的代碼)
然后我們來看下Unity3D自帶的60多個Shader。 這些Shader被分為五個大類:Normal,Transparent,Transparent Cutout,Self-llluminated,Reflective。由於數量比較多,將分幾個篇幅一一介紹。
(一) Normal Shader Family
這個家族一共9個Shader,都是針對不透明的對象的。
(1) Vertex-Lit:
最簡單的一種Shader之一,所有照射在該物體上的光在一個Pass里面渲染完,光源只在頂點計算。所以不會有任何基於像素渲染得效果,比如說:normal mapping,light cookies和shadows.這個shader對模型的剖分(將一個物體從幾何描述變為多邊形表示的過程)非常敏感,如果你將一個點光源放在很靠近一個立方體的一個頂點那里,並且對立方體使用這個shader,光源只會在角落計算。基於像素光照的shader對剖分沒有要求,在表現圓形高光上效果也很好。如果上述情況時你想要的效果,你可以考慮使用一個基於像素光照的shader或者增加模型的剖分。(增加頂點數)
總的來說,這個shader的渲染代價比較小。這個shader包含了2個subshader,分別對應可編成管線和固定管線。是所有硬件都支持的一個最基本的shader。如果設備支持可編成管線,那使用可編成管線的subshader,否則使用固定管線的。

(2) Diffuse:
Diffuse基於一個簡單的光照模型-Lambertian,光照強度隨着物體表面和光入射角夾角的減小而減小(即光垂直於表面時強度最大)。光照的強度只和該角度有關系,和攝像機無關。由於這是一個基於像素光照的shader,因此他有這類shader的優勢,同時他需要設備支持可編程管線,如果設備不支持,則自動使用Vertex-Lit這個Shader。
總的來說,這個shader渲染代價比較小。

(3) Specular
Specular 使用和Diffuse相同的光照模型,但是添加了一個和觀察角度相關的反射高光。這個被稱為Blinn-Phong光照模型。他包含了一個反射強光,這個反射高光物體表面角度,光的入射角度以及觀察者角度都有關系。這種高光計算方法實際上是對實時光源模糊反射的一種具有可行性的模擬。模糊的等級通過inspector里面Shininess這個變量控制。
主紋理的alpha通道被用來當作Specular Map來使用(有時候也稱gloss map),它定義了物體的反光率。紋理中alpha里面全黑 的部分將完全不反光(即反光率為0%)。而全白的的部分反光率為100%。這個Map在你的物體在不同的部分有不同的反光率的時候非常有用。比如說,銹跡斑斑的金屬會反光率低,而磨光的金屬反光率比較高。口紅的反光率比皮膚高,而皮膚的反光率比棉質衣服高。一個精心制作的Specular Map將會讓玩家身臨其境。如果目標設備不支持可編程管線,則自動使用Vertex-Lit這個Shader。
這個shader的渲染代價會比較大。

(4)Bumped Diffuse
同Diffuse Shader一樣,這個Shader基於Lambertian光照模型,同時使用了normal mapping技術來增加物體表面細節。相對於通過增加剖分來表現物體表面細節的方式,normal mapping並不改變物體的形狀,而是使用一張稱為Normal Map的特殊紋理來達到這種效果。在normal map中,每個象素的顏色代表了該像素所在物體表面的法線,然后通過這個法線(而不是通過物體模型計算而來的法線)來計算光照。可以說Normal Map在計算光照的過程中“高效地修改”了整個模型。
如何創建Normal maps:你可以通過導入一張普通的灰度圖(白色表示凸起,黑色表示凹進)Unity會自動將它轉換為Normal Map。
技術細節:這里使用Normal map是一種“Tangent space Normal Map”,Tangent space(正切空間)是一個跟隨模型物體表面的空間。在這個空間中,z軸始終從表面指向外面。Tangent space Normal Map相對於另一種被稱為“Object space Normal Map”來說有點復雜,但是他有一些優勢。1)可以使用在各種奇形怪狀的表面 2)便於在同一物體不同區域或者不同物體間復用
具體關於Tangent Space Normal Map和Object Space Normal Map的區別,下次再講。
如果調用這個shader失敗,則會調用Diffuse這個shader,一般而言,該shader渲染代價低。

(5) Bumped Specular
和Specular一樣的光照模型,相比Specular而言,它使用一張Tangent Space Normal Map來描述物體表面法向量的變化,來增加物體細節。(關於normal map具體見Bumpped Diffuse)如果調用失敗,則使用Specular這個shader,一般而言,這個shader的渲染代價會比較大。

(6) Parallax Diffuse
Parallax Normal mapped與傳統的normal mapped一樣,但是對“深度”的模擬更佳。額外的深度效果是通過Height Map(高度圖)來實現的。Height Map在Normal map的alpha通道里面保存。全黑表示么有高度,而白色表示有高度。通常這用來表現石頭或者磚塊間的裂縫。
Parallax mapping的技術很簡單,因此會有些人工痕跡或者不太正常的效果出現。尤其是,急劇陡峭的高低轉換在高度圖里面應該避免。在inspector里面調整height數值來調整高度的范圍,有時候會造成物體不真實,凌亂的情況。因此建議使用高度變化平緩的高度圖或者將高度數值設置比較低,讓表面看起來比較平緩。
這個shader的渲染代價相比bumped diffuse而言更大。如果調用這個Shader失敗,則自動使用Bumped Diffuse。

(7) Parallax Specular
與Bumped Spcular相比,增加了一張Height Map來描述深度細節。關於Height Map,見parallax Diffuse。如果調用失敗,則調用Bumped Specular這個Shader。

(8) Decal
這個Shader在unity文檔里面的描述和Unity3.0有明顯的實現區別,文檔由於比較老,07年寫的,官網下的Built-in Shader里面,decal是使用可編程管線實現的,就是說,如果你的機器不支持可編程管線,會使用diffuse,因為diffuse也不需要可編程管線,所以只能使用vertex-lit。這個Shader除了主紋理之外,這個Shader還是用了第二張紋理用來描述細節。第二張用來Decal(貼花)的紋理使用alpha通道來確定是否覆蓋主紋理。貼花用的紋理只是對主紋理的補充。比如說你有一個磚砌的牆壁,你可以使用一個磚塊的紋理作為主紋理,然后使用帶有alpha通道的Decal紋理在牆壁的不同地方塗鴉。

(9) Diffuse Detail
這是一個普通的diffuse shader加上一些額外數據的shader。它允許你定義第二張紋理,稱為Detail Texture。當camera靠近的時候,Detail Texture逐漸顯示出來,一般用於地形。比如說,當你使用一張低分辨率的紋理拉升到整個地形上的時候。隨着camera逐漸拉近,低分辨率的紋理開始模糊,這不是我們想要的效果。為了避免這個效果,創建一張Detail 紋理會將地形tile化。在這種模式下,隨着camera逐漸拉近,額外的細節將會出現以避免出現模糊的效果。
Detail 紋理是覆蓋在主紋理上面的。Detail紋理中深色的部分將會使得主紋理變深,而淡色的部分將會使主紋理變亮,Detail紋理通常是淺灰色。(與Decal里面Decal紋理不同的是,Decal紋理是RGBA,通過alpha控制Decal Texture與Main Texture的融合,而Detail的紋理是RGB,直接是兩張紋理的rgb通道分別相乘再*2,就是說,Detail紋理中顏色數值 = 0.5不會改變主紋理顏色,>0.5會變亮,<0.5加深)

