Shader Graph 教學 #1 — 頂點動態

River Wang
二流遊戲開發
Published in
Nov 27, 2021

[Github 專案]
[專案下載教學]

雖然之前說想開教學系列,但礙於時間有限,也不擅長寫這種內容,所以原則還是想到寫甚麼就寫甚麼,開心就好 XD

對於第一次接觸 Shader 開發的人來說,其實有必要去了解 GPU 的運作原理,至少要能理解整個繪圖流程 (Render Pipeline) 重點過程,包含 Vertex Shader 與 Fragment Shader 運行的時機點以及各自目的。但以上我還是不打算在這裡介紹,因為一定講不完 XD。

簡單說就是先進行 Vertex Shader 處理頂點資料,最重要目的是決定頂點位置。然後進行 Fragment/Pixel Shader 處理螢幕上的像素資料,最重要目的是決定像素填滿顏色。

另外就是雖然這是 Shader Graph 案例教學,我不會做 Shader Graph 的操作教學,甚至特定的節點用法教學。一方面同樣是時間有限,另一方面最重要的是其實我並不是想要教 Shader Graph,而是想要教 Shader Development,我希望我能幫助想學的人理解為何 Shader 要這樣開發/設計,這樣的原理是可以套用到任何開發工具上 (Unity Shader Graph /Amplify Shader Editor/Unreal Material Editor/Blender Shader Editor/…)。最終目的,希望大家都能認識 GPU 這個因為遊戲產業而進化出來的先進科技與藝術之結晶。

第一個範例就挑 Unity 官方早期為了推廣 Shader Graph 推出的 Demo。
場景: Assets\VertexDisplacement\VertexAnimate.unity
Shader Graph: Assets\VertexDisplacement\001_VertexDisplace.shadergraph

這個案例主要在 Demo 如何對頂點做動態變化,透過以 Sin 波形式持續產生的亂數影響頂點的位置,達成幾何外形有受到亂數震波影響之結果,然後同樣的原理也可套用到幾何內部的顏色自發光強度上。

教學案例中已依我認定合理的運作結構去區分各個階段群組(方便我直接貼過來找藉口少寫解釋說明 XD)

隨時間持續改變的 Object Space Position 之後會當作 Noise 節點的輸入參數
這裡運算完成之改變後頂點位置,會指定給 Master Stack 中的 Vertex Position,故以上運算都發生在 Vertex Shader 階段

在顏色處理方面使用上方頂點亂數動態計算相同的原理,隨時間持續改變的 Object Space Position 被當成亂數節點的輸入參數,故意計算二種亂數變化模式 (Voronoi 與 Simple Noise),最後用乘法計算把兩種亂數影響係數套用在幾何顏色上 (Emission)。

此處計算出 Emission 顏色指定給 Master Stack 中的 Fragment Emission,故發生在 Fragment Shader 階段

--

--

River Wang
二流遊戲開發

學生時代就跳入 Computer Grpahics 領域,其他技術好像都不想學/學不來,工作也找 Graphics 相關內容,但幾年後第二份工作才真的投入遊戲產業,不過也是個失敗的經驗。目前雖然逃離遊戲慘業,但也沒混出什麼出息,仍然在混口飯吃,並幻想著某天自己終於有時間開始完成自己想做的遊戲作品。