整體上,性能由高到低:
- Unlit,僅為紋理,光線不產生效果
- VertexLit
- Diffuse 漫反射
- Normal Mapped 法線貼圖
- Specular 高光
- Normal Mapped Specular
- Parallax Normal Mapped
- Parallax Normal Mapped Specular
另外,unity3d還內置有一些簡化的用作移動平台的shader/着色器。
推薦文章 內置shader詳解(帶圖)
Shader性能影響因素:
着色器性能影響因素較多,最主要有二:
- shader本身
- Rendering Paths (渲染路徑?)
性能最優的兩款 內置着色器:
- Deffered shader
- Vertex Lit
僅做繪制一次,性能只取決於紋理數。
在Forward rendering path:
性能僅取決於shader本身和場景中光源。
- Pixel Lit 性能更差,效果更好,多次繪制,故能實現(陰影,法線,高光等)
- Vertex Lit 性能更佳,所有燈光影響僅繪制一次
對內置Shader的通俗理解(轉):
1.Vertex-Lit:
基於: 基於頂點計算的光照模型
正方體: 【直接照射到的地方不會非常亮】【光照照射不到的平面無效果】
圓形: 【直接照射到的地方非常亮】【光照照射不到的地方有高光效果】
支持: 設備自動選擇【可編程管線】和【固定管線】
參數: 【主色color】【SpecColor光照顏色】【EmissiveColor自發光顏色】【Shininess光照強度】
渲染代價: 比較小
2.Diffuse:
基於: 基於簡單的光照模型 lambertian
正方體: 【直接照射到的地方會非常亮】【光照照攝不到的平面無效果】
圓形: 【直接照射到的地方非常亮】【光照照射不到的地方無效果】
支持: 設備需要支持【可編程管線】如果不支持將自動使用【Vertex-Lit】
參數: 【主色color】
渲染代價: 比較小
3.Specular
基於: 和Diffuse相同的光照模型,多了一個觀察角度相關的反射高光(#pragma surface surf BlinnPhong)
正方形: 【直接照射到的地方會非常亮】【光照照攝不到的平面無效果】【觀察角度和光入射角度會產生反射光】
圓形: 【直接照射到的地方非常亮】【光照照射不到的地方無效果】【觀察角度和光入射角度會產生反射光】
支持: 設備需要支持【可編程管線】如果不支持將自動使用【Vertex-Lit】
參數: 【主色color】【SpecularColor反射光照顏色】【Shininess反射光照強度】
渲染代價: 比較大
4.Bumped Diffuse
基於: 和Diffuse相同的光照模型,同時使用了法線貼圖normal mapping技術(UnpackNormal)【灰度圖,白色表示凹起,黑色表示凹進】
正方形: 和【Diffuse】一樣,【多了凹凸感】
圓形: 和【Diffuse】一樣,【多了凹凸感】
支持: 如果設備不支持,將自動使用【Diffuse】
參數: 【主色color】【多了法線貼圖】
渲染代價: 比較大
5.Bumped Specular 凹凸反射
【Bumped Diffuse】與【Specular】的合並
支持: 如果設備不支持,將使用【Specular】
6.Parallax Diffuse
基於: 和Bumped Diffuse一樣的光照模型lambertian,也使用normal mapping技術(UnpackNormal),同時使用HeightMap(ParallaxOffset)實
現更加逼真的凹凸感【高度圖在法線貼圖的alpha通道保存,全黑表示么有高度,白色表示高低】
支持: 設備無法使用,會自動使用【Bumped Diffuse】
參數: 【主色color】【多了法線貼圖】【多了高度貼圖】【height設置高度參數】
渲染代價: 比【Bumped Diffuse】更大
7.Parallax Specular
基於: 使用【Bumped Specular】+【高度圖】
支持: 設備無法使用,會自動使用【Bumped Specular】
8.Decal 【貼花】
基於: 與Diffuse一樣基於Lambert,增加第二張貼圖,然后融合色彩(lerp)覆蓋在主紋理之上【注:DiffusDetail的融合是rgb*rgb】
支持: 設備需要支持【可編程管線】如果不支持將自動使用【Vertex-Lit】
參數: 【主色color】【兩張貼圖】
9.Diffuse Detail 【細節貼圖】
基於: 與Diffuse一樣基於Lambert,多了一張貼圖與之融合(rgb*rgb),一般用於地形,攝像機拉近時額外的細節會出現。
說明: Detail 紋理是覆蓋在主紋理上面的。Detail 紋理中深色的部分將會使得主紋理變深,而淡色的部分將會使主紋理變亮, Detail 紋
理通常是淺灰色。(與Decal 里面 Decal 紋理不同的是,Decal 紋理是 RGBA,通過 alpha 控制 DecalTexture 與 Main Texture 的融合,而 Detail
的紋理是 RGB,直接是兩張紋理的rgb 通道分別相乘再*2,就是說,Detail 紋理中顏色數值 = 0.5 不會改變主紋理顏色,>0.5 會變亮,<0.5 加深)
參考
參考文章 shader實例(五)如何在unity中更好的運用shader
參考文檔 Usage and Performance of Built-in Shaders