【Unity】Shader Forge插件入門教程
說明:現在Unity2018都提供了官方的ShaderGraph,建議學新不學舊,學官方不學第三方。——2018.6.21
一.安裝說明
~下載
- Unity Asset Store購買並下載https://www.assetstore.unity3d.com/en/#!/content/14147
- 其他渠道下載ShaderForge Package。
~安裝
- 將Package導入到Unity。
- Unity引擎菜單欄:Windows標簽->Shader Forge打開插件使用界面
二.界面說明
~打開插件后的界面

New Shader:新建一個Shader文件
Load Shader:導入已有的Shader文件
PolyCount thread:PolyCount頁面
Unity:Unity Forum的頁面,在Unity Asset Store上架的資源在Unity Forum均有頁面,有問題可以去里面提問。
Node Documentation:Shader Forge中的節點說明文檔(重要)
Wiki:Shader Forge的維基文檔
~選擇New Shader后的界面

Unlit:無光照的Shader模板,選擇此模板,使用該Shader的材質將不受光照影響。
Lit(PBR):符合Unity PBR的Shader模板,采用基於物理的光照模型。
Lit(Basic):使用Blinn-Phong光照模型的Shader模板。
Custom Lighting:自定義光照Shader,在此Shader模板中實現自己的光照模型。
Sprite:2D精靈Shader模板,基於2D。
Particle(Additive):主要應用在發光效果的粒子Shader。
Particle(Alpha-Blended):主要應用在細碎效果的粒子Shader,如風沙。
Particle(Multiplicative):主要應用在昏暗效果的粒子Shader,如黑煙。
Sky:天空。
Post-Effect:屏幕空間后期處理Shader
~以選擇Unlit模板進入的界面來說明

紅框區域為Shader的通道,黑色的通道為該Shader模板激活的通道,灰色通道為該Shader模板凍結的通道。只有激活的通道可以連接節點。
紅框區域常用通道:
Diffuse:漫反射
Specular:鏡面反射
Normal:法線
Emission:自發光
Opacity:不透明度
橙色區域為節點,圖中的節點是新建Shader后默認連接的Color節點。
黃色區域為預覽窗口,用來觀察Shader效果。
黃色區域上方屬性:
Return to menu:返回界面1。
Settings:Shader Forge界面的一些設置,講解見后文。
Compile shader:編譯為.shader文件,編譯成功按鈕為綠色,編譯不成功or改動后按鈕為紅色。
Auto:是否自動編譯shader,建議選中。
黃色區域內屬性:
屬性1:選擇預覽的模型。
屬性2:預覽窗口的背景色。
Skybox:選擇天空盒,在不受天空影響的模板中被凍結。
Rotate:選中后模型自動旋轉。
紫色區域為相關屬性選擇列表,講解見后文。
三.簡單案例
根據目前移動平台的依舊廣泛使用Blinn-Phong光照模型的特點,我們選擇Lit(Basic)模板,來制作一個移動平台的Shader。通過簡單的制作流程,來了解Shader Forge的基本使用。

以上效果可以分解為漫反射通道制作,法線通道制作,高光通道制作,描邊制作。
具體步驟:
- 選擇New Shader,在新界面中選擇Lit(Basic)模板,修改你的文件名並選擇文件路徑確定。
- 預覽窗口中的預覽模型使用默認的球體,背景色改為白色,選中Rotate。
- 在節點編輯窗口中,鼠標左鍵拖動視圖,將節點以及通道調整的合適的位置。
- 鼠標右鍵菜單中Properties->Texture2D,選中並在節點視窗生成一個Texture2D節點。(在Settings中,選中show node browser panel可以在屏幕右側面板快速選中。)鼠標左鍵拖動到Color節點附近。
- 選中Texture2D節點,點擊節點上出現的Select按鈕,在出現的窗口中選擇一張漫反射紋理貼圖。
- 選中Color節點,點擊節點上出現的顏色選擇按鈕,在出現的色盤中選擇顏色。
- Arithemtic->Multiply生成一個Multiply(乘)節點,將Color和Texture2D的RGB輸出引腳分別拖動連接到Multiply的A,B兩個輸入引腳上。(節點的右側引腳為輸出引腳,左側引腳為輸入引腳。連接方式為:節點1輸出引腳——節點2輸入引腳or通道)
- 調整三個節點的位置,Alt+鼠標左鍵框選三個節點並移動到通道附近,將Multiply的輸出引腳連接到Diffuse通道上。
- 點擊Compile Shader,建議Auto。這時可以看到預覽窗口中已經有了紋理疊加顏色后的效果了。(color1*color2,等同於Photoshop中的正片疊底效果。)
- 重復步驟4生成一個Texture2D節點,重復步驟5選擇一張法線貼圖。
- 勾選Texture2D節點上的Normal map,並將上方的White改為Bump。(Normal map使用法線貼圖必勾選,White修改為Bump使得在材質編輯器中選擇一張Texture Type為Default類型的紋理時,會提醒你是否修復為Normal map。)
- 將法線紋理節點的RGB引腳連接到Normal通道上。預覽窗口中的模型將表現出法線的凹凸效果,可以鼠標右鍵移動光源觀察。
- 重復步驟4生成一個Texture2D節點,重復步驟5選擇一張高光貼圖。
- 將法線紋理節點的RGB/R/G/B/A引腳連接到Specular通道上。(高光貼圖如果只占用一個通道,那就只選擇相應的通道引腳連接。)
- Constant Vectors->Value,生成一個Value節點,輸入0.05並連接到Outline Width通道,此時預覽窗口可以看到黑色的輪廓邊緣。
- Properties->Color,生成一個Color節點並修改顏色,連接到Outline Color通道,此時預覽窗口可以看到相應顏色的輪廓邊緣。
- 在左下角的屬性選擇列表區域,點開Properties標簽,修改節點的名稱(英文)。(或者在節點上方的label里修改。)里面每個屬性標簽都將暴露在材質編輯器界面供美術進行參數調節,修改的名稱則是你在材質編輯器中看到屬性名稱。
- 上下拖動標簽可以改變屬性的順序。
但是調節邊緣寬度的屬性並沒有暴露出去
- 將Value節點連接到Outline Width的線斷開(Alt+鼠標右鍵),使用Properties->Value替換該節點。(Constant Vectors->Value生成的Value節點是常量,不可修改,也就不會暴露給編輯器。)
- 回到Unity,選擇.shader文件並create material。
基礎操作和講解見官方入門指南http://www.neatcorporation.com/Projects/ShaderForge/Media/ShaderForge_QuickStart-sc.pdf
更多案例詳見官方教程文檔
http://acegikmo.com/shaderforge/tutorials/

四.節點

節點在Shader Forge里面分為以上幾個大類。
- Arithmetic:包含各種數學計算公式。常用abs(絕對值),Max/Min(最大/最小值),OneMinus(1-),Lerp(線性插值),Floor(向下取整),Multiply(乘)。
- Constant Vectors:常數變量,一維到四維以及4*4矩陣,不會暴露給材質編輯器。
- Properties:包含暴露給材質編輯器的各種屬性。常用Color,Texture2D。
- UV Operations:針對UV的相關操作。
- Geometry Data:包括了幾何體的輸入數據,包括模型的UV,法線方向,世界坐標等等。
- Lighting:光照的相關數據,主要用於Custom Lighting Shader模板中。
- External Data:其他數據,包括視點位置,屏幕參數,時間等。
- Scene Data:場景數據,包括fog顏色,場景深度等信息。
- Math Constants:數學常量,如π。
- Trigonometry:三角函數。
- Code:代碼塊,函數塊。
- Utility:略。
節點詳述請參考節點文檔:http://acegikmo.com/shaderforge/nodes/?lang=zh_cn
五.屬性列表
Shader Settings標簽

Path:文件路徑,可修改。
Fallback:在運行平台硬件不支持該shader的情況下,選擇替代shader。
Allow using atlased sprites:2D開發使用,3D默認即可。
Draw call batching:批處理繪制調用,默認Enable。
Inspector preview mode:3D/2D/sky,制作的什么類型選什么。
Target renderers:目標渲染器,如無特殊需求,默認。
Properties標簽

在此標簽修改暴露給材質編輯器的屬性名稱(英文),順序以及默認值。
Lighting標簽

Render Path:渲染路徑,正向渲染或延遲渲染,移動平台選擇正向渲染即可。
Light Mode:光照模型,對應不同的Shader模板。分別是無光照(UnLit模板)、Blinn-Phong光照模型,Phong光照模型,PBL(基於物理光照,Lit(PBR)模板)。
Gloss Mode:使用光澤度還是粗糙度模型,根據自己需要。
Transparent Mode:透明度模式,淡出or反射。
Remap gloss from [0,1] to [1,2048]:重映射光澤度從[0,1]到[1,2048]。
Enery Conversing:能量守恆,PBR需要勾選。
Lighting Count:光源數量,單一定向光(太陽光)or多重光源
Lightmap & light probes:燈光貼圖&燈光探針。
Per-pixel light probe sampling:逐像素光照探針采樣。
Reflection probe support:支持反射探針。
Receive Ambient Light:是否接受環境光。
Mask directional light specular by shadows:定向光高光是否被陰影遮擋。
Geometry標簽

Face Culling:面剔除,默認是剔除背面,可選剔除正面,也選擇雙面渲染。
Normal Quality:法線質量,插值或歸一化,默認使用歸一化。
Vertex Positioning:頂點位置,世界空間or裁剪空間or廣告牌(法線面向攝像機)。
Normal Space:法線空間選擇,切線or建模or世界,默認切線空間。
Vertex offset mode:頂點偏移模式,相對偏移or絕對偏移。基於模型空間的頂點偏移叫做相對偏移,世界空間的頂點偏移叫做絕對偏移。
Tessellation Mode:細分模式,一般不需要用到細分,DirectX11特性。
Outline Extrude Direction:描邊擠出方向,一般都是沿着頂點法線方向。
Per-pixel screen coodinates:逐像素屏幕坐標。
Show 2D sprite pixel snap option in material:在材質中顯示2D精靈像素單元設置,3D開發忽略。
Blending標簽

Blend Mode:混合模式,如果是不透明的就選擇Opaque,其余根據需要選擇。
Source*_+Destination*_:源*_+目標*_,決定了源圖像與目標圖像以哪種方式混合。
Color Mask:顏色遮罩,需要過濾的通道取消選擇。
Dithered alpha clip:抖動透明裁剪,開or關。
Offset Factor:偏移因子。
Offset Units:偏移單位。
Per-object refraction/scene color (expensive):
Receive Fog:應用霧。
Auto Sort:自動排序,如需手動改變排序,在Order中改變數值。數值越小,在渲染隊列越靠前。
Depth Test:深度測試。
Ignore Projectors:忽略投影器。
Write to Depth buffer:是否寫入深度緩存。
Stencil Buffer:是否開啟模板緩存。
Settings內容

Real-time node rendering:實時節點渲染,是否開啟看需求。
Using scroll in the quickpicker:在快速拾取中使用滾動。
Show variable name & precision:顯示變量名和精度,看需求開啟。
Show node browser panel:顯示節點瀏覽面板,是否開啟看個人習慣。
Hierarchal Node Move:層次節點移動。
六.優化
- 節點盡量精簡。
- 浮點精度降低,開啟Show variable name & precision后,每個節點會顯示變量名稱和精度。針對移動平台,需要降低浮點精度以符合GPU的需求。Float/Half/Fixed精度分別為32/16/11位。常規顏色使用fixed,包括紋理數據;短向量,方向,模型空間坐標以及高動態范圍顏色用half;世界空間坐標,紋理坐標,以及需要復雜計算的三角函數,指數冪函數計算使用float。
- 計算過程中,盡量避免數據類型轉換。
