天天看點

ShaderForge插件分享

ShaderForge插件分享

ShaderForge是一款為Unity所用的、基于節點操作的Shader插件。筆者一直想寫一篇關于ShaderForge的教程,希望可以分享給想學習Shader的美術。通過該插件,美術不需要編寫代碼就可以制作Shader。同時筆者也希望Shader程式員能客觀看待這款插件,美術效果和代碼優化需要美術和程式的共同配合來完成。

本文主要從插件使用和代碼優化兩個方面來介紹ShaderForge在手機遊戲上的應用。

官方首頁:http://www.acegikmo.com/shaderforge/

通過ShaderForge建立Shader後,會提供一些Shader模闆,建立對應于不同光照模型的Shader。

ShaderForge插件分享

ShaderForge的預設使用者界面分為預覽、Shader設定(名稱、屬性、光照模型、幾何繪制、混合模式)、節點連線編輯面闆、節點清單。

1. Main節點

在建立Shader檔案時,預設會有一個唯一的Main節點,用于輸出材質效果。大家可以參考Unite2014-ShaderForge教程進行整理,連結如下:

https://www.youtube.com/watch?v=WMHpBpjWUlY

ShaderForge插件分享

基本輸出會根據 Lighting 設定中的所選的不同光照模型(Unlit/Custom、Blinn-Phong、Phong、PBL)進行計算。

ShaderForge插件分享

無光照的情況下 FinalColor.rgb = Emission。

使用光照模型的情況下 FinalColor.rgb = Diffuse + Specular + Emission,Normal用于Diffuse和Specular的光照計算。

手機遊戲使用光照 一般使用 Forward 前向渲染,使用光照模型 Blinn-Phong ,會計算漫反射、環境光和高光。 Light Count 代表接受單個光源Single Directional還是多個光源Multi-light的影響。 Lightmap & light probes 代表可參與光照烘焙。 Receive Ambient Light 代表接受Lighting面闆中設定的環境光的影響。

光照部分的輸出 用于在基本光照模型上添加間接光照(Ambient Light和Ambient Occlusion)或者改變光照模型使用自定義光照模型(Custom Lighting)。

使用基本光照模型時,Diffuse = DirectDiffuse + IndirectDiffuse, DirectDiffuse = GI.DirectDiffuse, IndirectDiffuse = (GI.IndirectDiffuse + DiffuseAmbientLight) * Diffuse AmbientOcclusion。

使用自定義光照模型時,Diffuse = CustomLighting。

透明部分的輸出用于計算透明值。ShaderForge會根據連線情況來配置 Blending 設定中的混合模式(Opaque、AlphaBlend等)。

ShaderForge插件分享

預設沒有透明輸出時,混合模式為Opaque不透明模式,FinalColor.a = 1。Opacity有輸出時,根據混合模式對應的運算得到透明度,FinalColor.a = Opacity。

常用的半透明混合模式有AlphaBlend、Additive,AlphaBlend的計算方式為:SrcAlpha+DstOneMinusSrcASlpha;Additive的計算方式為SrcAlpha+DstOne。

OpacityClip有輸出時,會忽略混合模式,預設情況下隻渲染高于0.5的顔色值,FinalColor.a = Clip(OpactiyClip -0.5)。

Receive Fog 代表接受霧效影響。 Auto Sort 代表根據混合模式自動選擇渲染隊列,一般情況下不需要手動修改。 Ignore Projectors 代表忽略投影這類對象的影響。 Write to Depth buffer 代表寫深度。

幾何繪制部分的輸出可以改變繪制物體的頂點計算。

ShaderForge插件分享

2. 節點操作

從節點清單裡選擇節點拖動到編輯面闆中,熟練後可以通過節點名稱的首字母以快捷鍵的方式找到節點。比如使用快捷鍵“T”找到Texture2D節點,點選添加。

ShaderForge插件分享

3. 其他常用的快捷操作

選中節點:使用Alt+滑鼠框選

ShaderForge插件分享

斷開連線:使用Alt+右鍵劃動

ShaderForge插件分享

官方對節點的說明有詳細的描述和圖解,建議有疑問的時候去檢視官方文檔:

http://www.acegikmo.com/shaderforge/nodes/

這裡簡單說明下顔色的加減乘幂運算。Multiply乘法通常用于使顔色變亮(Color2.0)或變暗(Color0.5),Add加法通常用于使顔色變亮(Color+0.5),Subtract減法通常用于使顔色變暗(Color-0.5),Power幂可以用于對比度調整(Pow(Color,2.2))。

涉及判斷(If)的運算通常不推薦在手機遊戲中使用,可以通過Min、Max、Step等運算避開。

1. 偏色

ShaderForge插件分享

2. UV變化

Pannel、Rotation等節點可用于改變UV,配合Time節點的運算可以産生UV動畫。

ShaderForge插件分享

3. 勾邊光

Fresnel節點用于擷取繪制對象的邊緣。

ShaderForge插件分享

4. 地形

Lerp線性插值可以通過一個蒙版貼圖來混合兩張貼圖來得到混合效果。

ShaderForge插件分享

從美術的角度來看,不管是否想學習Shader代碼,都需要了解它并配合程式員完成最終的優化。優化工作一部分在于節點的使用,另一部分在于代碼的删減,這兩個方面都可以由程式員來配合完成。從程式的角度來看,也許會認為美術制作Shader是不可掌控的,而實際上,我們應該鼓勵美術去學習圖形化的Shader編輯工具,并進行指導和優化。

使用ShaderForge制作的Shader可以通過文本的方式打開檢視,ShaderForge通過代碼開始位置的注釋來還原節點連線。

一個普通Shader使用ShaderForge與手寫代碼的對比如下圖所示。

ShaderForge插件分享

根據Shader設定會生成對應的代碼,對應的關系如下圖所示。

1. Shader Settings 和 Properties 子產品

ShaderForge插件分享

2. Lighting 子產品

ShaderForge插件分享

3. Geometry 和 Blending 子產品

ShaderForge插件分享

節點連線生成的代碼大部分在frag這段内容中,可以通過對比的方式來找到節點計算對應的代碼,對前文節點示例中的節點圖舉幾個例子:

ShaderForge插件分享
ShaderForge插件分享
ShaderForge插件分享

通常我們會手動修改node_9660這種臨時參數為可了解的變量名稱。

經過了幾個版本的更新,ShaderForge生成的代碼實際并沒有太多的備援部分。主要表現在三個方面:

1. 多餘的編譯指令

根據實際使用的光照情況可以選擇性地去掉多餘的光照編譯指令項。

ShaderForge插件分享

2. 多餘的采樣UV定義

當需要采樣多個貼圖時,考慮到貼圖的UV可以從同一個UV采樣進行計算,可以省去多餘的UV采樣。

ShaderForge插件分享

3. 多餘的變量定義

備援的變量定義可以手動進行合并。

ShaderForge插件分享

原文出處:侑虎科技

本文作者:admin

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀