Cloud Lin
Cloud Lin
Apr 22 · 7 min read

By Cloud Lin

Visual Effect Graph(以下簡稱vfx graph)是一個強大的Unity工具,可以用來製作令人驚豔的粒子特效。因為啟發於電影特效製作工具軟體,所以vfx graph裡的很多功能都採用了類似電影特效工具的介面與編輯方式,在易用性跟視覺性上面比傳統的Unity粒子系統都有了很大的進步。

這篇文章會簡單介紹以下的內容
* vfx graph與unity傳統的手裏劍粒子(shuriken particle system)系統有何不同
* 簡介 HDRP (High Definition Rendering Pipeline)
* vfx 安裝與設定
* 編輯 vfx graph的基本概念

## vfx graph 與 shuriken particle system的不同

  1. vfx graph運作在GPU上而傳統的particle system運作在CPU上。
    這是最重要的不同之處。運作在GPU上的vfx意味著它可以處理數以百萬計的粒子,而運作在CPU上的則只能同時Handle千~萬數量的粒子。
    運作在GPU上可以進行更多複雜的平行計算如流體的模擬。
    可以從GPU存取frame buffer的特性讓你可以放一張texture在buffer裡,再用粒子模擬出該圖片的形狀。

2. GPU本身不做物理運算,Unity的物理運算基於CPU之上。
意味著如果你想要建立一個能與遊戲裡的物理環境互動的粒子特效,使用傳統的particle system會較為容易一些。GPU端並非完全無法做物理計算,但耗費的cost相對很昂貴,而且你可能同時要對百萬個粒子進行物理運算,使用上要注意效能問題。

3. 裝置相容性問題。
值得注意的是vfx graph需要使用compute shader, 包含在HDRP(High Definition Rendering Pipeline)裡,而不是所有的裝置都支援此shader。例如大部分的手機都無法跑vfx graph。PC與PS4端則可。

4. GPU的粒子無法Readback。
readback或稱回播可以將粒子延飛出的路徑倒回播放,而運作在GPU上的vfx是難以實現將粒子回播這件事的。

## 簡介 HDRP (High Definition Rendering Pipeline)
什麼是HDRP ? 在解釋之前得先提到 SRP (Scriptable Render Pipeline),SRP是在Unity2018.1後引進的preview功能,允許你根據自己的專案需求制定自己的渲染流水線。只要撰寫自己的C#腳本就能自定義渲染流水線。
什麼是渲染流水線?最常看到的圖片大概是以下這張

我們可以看到一個在電腦資料中的3D物件從model到screen space顯示到你的螢幕之間做了許多的空間轉換與著色。換個方式說render pipeline就是定義”如何讓一個物體呈現在螢幕上的流程與處理步驟”。

傳統的RP從高層來看可以區分為以下三件事情
1. culling — 裁切必要顯示的物件與計算遮擋
2. render objects — 著色
3. post processing — 畫面後製處理

傳統的Unity這些步驟的詳細實作都已經被包好了,不管你做的是3A大作還是8-bit風小遊戲,都只能透過一樣的渲染線去顯示,而SRP就是讓你在這些步驟中能自訂部分的實作內容,來針對自己的專案屬性去做客製化。例如你做的只是8-bit小品遊戲,你可能就可以減少著色上的精細度,而在3A遊戲中,你可能想對光照反射做更深一層的處理。

Unity已有兩個SRP,Lightweight的重視效能,支援所有平台,HD重視圖像品質,目前只能在PC、Mac with Metal、PS4與Xbox One上執行。

## vfx 安裝與設定
vfx graph目前只能在Unity 2018.3以後的版本執行,除了安裝以外還必須做一些設定,一步步來看。

在Unity Hub裡必須選擇2018.3之後的版本,並在Template中選擇High Definition RP。

從Window -> Package Manager打開 -> 找High Definition RP更新到最新

然後往下捲動搜尋 Visual Effect Graph,安裝他。

都安裝完後應該可以從Project視窗創建一個新的vfx graph了,我們創建一個

朝著新創建的特效點兩下即會開啟vfx編輯視窗,從這裡可以看到vfx最基本有4個node : Spawn, Initialize, Update, QuadOutput

## 編輯 vfx graph的基本概念
打開vfx graph編輯視窗,可以看到這是個Node-based的編輯器,如果有用過Shader Graph之類的東西的話應該會覺得相當相似。

Spawn, Initialize, Update, QuadOutput這些外圍的大框稱為 “Node節點”、而裡面的component如Initialize的node裡的Set Velocity Random、Set Life Time Random則稱為 “Block區塊”。每一個Node都是由一或多個的blocks組成,而粒子的行為與表現則是由各個node之間交互作用的結果。

四個最初的node代表:

* Spawn : 粒子的產生設定,例如每秒產生多少新的粒子

* Initialize : “每一個”粒子在被產生時會做的初始化設定,例如Set Velocity Random會將每個粒子隨機往各個位置生成,造成粒子隨機漂移的效果

* Update : 跟Unity腳本裡的Update很相似、就是每個Frame會對粒子做的事情。例如在Update裡加個SetColor的block,則粒子的顏色會隨著時間一直變化。

* Quad Output : 最後對粒子做的有關輸出相關的node,例如顏色與大小、材質、透明度等等。與Update一樣是每個frame執行,但output可以不只一個,也就是說可以同一個Initialize與Update卻分別輸出兩個Output達到不同的呈現效果。

想要簡單測試一下VFX的威力,可以仿照以下做法
1. 創建一個新的vfx graph檔案
2. 將 Spawn裡的Rate設成50000,代表一秒產生5萬個粒子
3. Quad Output裡的Set size over time,點選綠色曲線,將右邊的1拉到0.2左右,調小粒子的圖片大小才看得清楚
4. 將Initialize node裡的 Capicity設程100000,代表最大容許10萬個粒子同時存在

然後你應該可以看到如圖下非常巨大數量的粒子,但電腦卻不會crash,這是傳統的shuriken particle system做不到的事情,也是base on GPU的vfx graph魅力所在。

## Reference
https://unity.com/visual-effect-graph
https://youtu.be/0U5uxl7XDkY

Akatsuki Taiwan Technology

Engineer Blog of Akatsuki Taiwan

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade