著色器(Shader)在遊戲開發中可謂蒙著一層神秘的面紗,在人數本就不多的遊戲開發者中,掌握Shader使用的中更是少之又少。Shader功能的實現說實在的也和一般撰寫程式碼沒有有什麼差異,同樣在撰寫程式碼,為什麼撰寫Shader的人少之又少?其中最大的困難點在於對於數學上的認知和應用,以及不容易的設定。
撇開本來就複雜的數學概念不說,很久之前要設定Shader的環境就困難重重,再加上之前用組合語言的概念在寫,中間又要很多潛規則,再加上顯卡的支援性等,一整個就很不方便。而後的演進則慢慢的高階的類C語言進行撰寫,雖然看起來簡化了複雜度,但仍是很不友善的。好吧,講白了就是那時自我的認知不夠,導致沒有學習的需求和動力。
而這二年隨著Unity在呈現方面著手調整下,撰寫Shader日漸成為必要的手段,就連Unity推廣的Visual Effect Graph,也和Shader脫不了關係。也就是說了解Shader對於在Unity開發生態中勢必為不可逆的。而隨著近日Unity將Light Weight Rendering Pipeline命名為Universal Rendering Pipeline後,推廣的力道會更加快速。
想說趁著這次挑戰,就安排一段時間研究Shader和Unity的呈像生態,一方面有足夠的動力,二方面也是為了日後的開發進行準備。就於接下來這幾天邊看著教學影片邊跟著動手實作,並將一將過程記錄下來。
工具的選則上,伴隨著Unity Scriptable Rendering Pipeline的Script會選用Shader Graph視覺化工具進行,然而Shader Graph是建構在新的呈像機制上所發展的工具,但在某些專案的開發上,一時之間也還未切入到新的呈像機制,故使用Shader Graph並不適合。
還好Unity擴充中的Amplify Shader,一樣是視覺化的Shader開發工具,不但可以套用新的呈像機制,也可以使用原來的機制(事實上這是預設的)。在這個不太明確的階段,最好的方式就是同時針對二套視覺化工進行理解,而隨著開發的需求逕自使用最有利的方案進行。
但工具也只能減低撰寫時不確定性所帶來的複雜度,Shader另個面貌是數學應用的展現,這是屬於理論的範疇,工具可能也幫不上什麼忙。
雖說要趁這些時間研究Shader,但其博大精深,感覺起來也不是一時三刻就能學會的。自己目前是安排從這幾個Shader
著手進行二個工具的實作,透過相同的Shader一方面可以了解到工具之間的差異用法,另一方面可以評估其適性。記錄撰寫的同時,也安排時間了解數學理論的概念,而不是純粹的學習工具怎麼用。若是基礎知識建立後,工具的更換也比較不受影響。
這部分就是做中學,可能也會有不少的錯誤,若是記錄上的觀念不正確,也請不吝賜教。