關於下半年
8月初的時候,離開了待了將近八年的公司,離開的原因是 - 我明年3月底(沒出意外的話)要去日本念語言學校一年,雖然多少會捨不得(跟少賺了些錢),但提早將近半年離職是因為想去做一些這些年來在累積的 【重要但不緊急】 的事情。
回家體感沒過多久,一眨眼2023就要結束了,每天的行程也是自己排到近乎爆滿的狀態(早8晚9),這篇blog就回顧一下2023下半年,各方面的進度。
積年累月的【重要但不緊急】事項們
這些年來,總是會不斷冒出一些 對我來說好像很重要 但當下又沒空去處理的事情, 最終主要整理出幾個大項目 -
身體健康
健康檢查報告一年比一年慘,前年耳朵出問題, 連續兩年極度缺乏缺維生素D +今年胃潰瘍 + 頸椎有骨刺。
強化Graphics Programming的基礎
從Unity開始接觸shader大概四年了(2019年9月開始),過去四年下班後有很大量的學習時間,不是在寫Unity的C#,就是在摸索,嘗試各種Shader相關的功能。
從一開始的surface shader,到後來寫custom shader做出各種不同的效果、到後來開始玩compute shader、研究SRP…等等,過程中是對graphics programming產生滿大的興趣,而且也發現寫面向GPU的code時,很多東西是可以帶回cpu端改良自己的gameplay logic的,讓我覺得很實用。(還順便做了個插件 )

但是,隔著一個遊戲引擎學computer graphics,始終是多了好幾層封裝過後的API,舉例來說 : Unity中寫custom shader時就已經有各種引擎提供的built-in variable、macro能用,想進行offscreen rendering則多了個RenderTexture api要學,而且網路上有大量blog的關係,這也讓我一直可以不用去重新實那些對一個現代的renderer來說較為最基本的東西,像是shadow map、TAA、FBO、skinned mesh。直接用現成的結果是 - 我覺得我過度依賴API還有網路上的forum或是一些blog,因此也缺乏做出一個優於市場上其他競品以及處理不同的edge case,所需的實作經驗。
而且過於依賴引擎的API也會有另一個問題 - 換一個開發環境的時候,陣痛期會特別長,雖然遊戲開發中大部分的觀念都是通用的,但對底層的實作不夠熟悉時、仰賴引擎提供的API的結果就是得用「引擎A的API在引擎B叫應該會叫做..…」的角度,而不是「某API應該會在引擎中的某個時機點去實作」去思考,比較起來就是很沒效率。所以我一直都很想找機會來個重新造輪子,自己實做一個3D場景的渲染專案。除了充實自己的基礎知識外,我相信也可以有很多解決不同面向問題的收穫。
數學
我是我認識的寫code的人之中,數學最爛的,沒有之一。從小對數學就是有一個障礙,但我很清楚一件事情 - 「如果未來要認真搞graphics,數學是躲不掉的」,gameplay也許用向量跟線性代數就能挺過幾乎所有的狀況,但graphics的東西扯到渲染方程跟光照就是滿滿的微積分,GDC/SIGGRAPH上很多paper上是沒有程式碼的,舉例來說 - Ready at Dawn Studios發表的The Order 1886這款遊戲的渲染paper,計算皮膚間接光的次表面散射是沒有code可以參考的,網路上也是幾乎找不到這部分的實作。
只有下面這坨東西 -

因此,將數學的算式拆解並自己轉化為程式碼的能力是必須的,加上還看到網路上這張troll圖,

我就是suck,直接被激到。於是【學數學】,就是一件一直放在自己心裡但沒去做的事情。
打電動
說來諷刺,在遊戲公司寫了將近8年code,這期間玩的遊戲是是越來越少….一年可能就一兩款,但我心底是很熱愛遊戲的,於是我決定這段空窗期打電動是一項很重要的事情。
日文
去補習班從50因從頭念完N4之後,就考過N3了,後來也把N3的課程上完了。但其實檢定都不重要,最重要的是明年到語言學校的能力分班,還是希望到時候能分到程度中上一點的班過得比較精實一些。所以出發前還是要盡量充實單字量。這項其實滿緊急的XD。
【重要但不緊急】事項的進度
身體健康
開始吃維生素D,吃飯時間在公園曬太陽、吃表飛鳴、戒咖啡因、8、9月天天跑復健科治骨刺,還順便第中了第一次的covid。
但我還是覺得我很不健康,我覺得就隨緣吧,生死有命,富貴在天,時候到了別走的太痛苦就很感恩了。
強化Graphics Programming的基礎
為了對graphics有更深入的了解,直接接觸Graphics API我想是個很好的方式,於是我就用C++/OpenGL做了個 💩 💩等級的renderer,這個renderer就當成我的練功房,沒事就在裡面實做一些心血來潮想寫的功能。
Graphics API有很多種(DX11, DX12, OpenGL, Vulkan, Metal),OpenGL上一次大更新是2017年的時候了,選擇用OpenGL是因為上手容易學習資源多,加上現階段也沒有使用Hardware RT的需求。
每個月我都會把下個月預計要實作/念的部分拉到notion上的todo list做紀錄。

8、9月就是把LearnOpenGL上的東西刷完(加上去醫院復健),LOGL這網站cover了大多對graphics來說所需的最基礎概念跟對應的一些feature,其實刷完也並不是對OpenGL的API熟悉了,但過程中對矩陣跟空間變換的操作有更深刻的印象是很大的收穫。
10月整個月都在跟PBR打交道,從standard BRDF、IBL、Google Filament還有UE/Unity HDRP的各種材質的實作,最終是實作了filament上standard BRDF, clear coat,HDRP的cloth三種材質,還有對應的各種IBL。PBR的理論對我來說真的硬,一堆數學,當下真的是完全看不懂,中間還要看球諧函數的各種paper,直接消化不良,球諧函數的部分大概從10月看到12月寫skin shader時才真的是搞懂7成。未來有機會寫GI一定是得再回頭複習PBR理論這一塊。
球諧函數的實作要特別感謝遊戲界大佬TheRealMJP的Baking Lab repo,非常佛
11月開始,已經沒甚麼教學網站能看,就開始很隨興的實作自己有興趣的功能,看一些渲染的文章,比如說color space的理論、闫令琪的GAMES101-现代计算机图形学入门與GAMES202-高质量实时渲染,把一些編輯器的基本功能 : 編輯/儲存材質球asset,用gizmo拖拉物體,scene hierarch、骨架動畫..etc,另外也花了點時間寫CPU path tracer。
12月實作了一些進階一點的花俏功能進renderer專案中,包刮用compute shader做forward+ rendering,還有再次挑戰以前看不懂的The order 1886的paper,大概是有在khan academy念數學或者稍微開竅,這次看懂並用蒙地卡羅積分算出貼圖,成功做出skin shader。然後昨天總算趕在月底前實作了HBAO。
寫Renderer的成果
總結來說,經過短短的四個多月,我對graphics api其實還是滿陌生的XD,專案中其實有很多不那麼理想的呼叫api的方式,未來還需要不停的refator才行,但透過在這小小renderer中重新造各種輪子,對在shader中各種空間下中的操作可以說是更熟悉了,以前都會想盡辦法先到world space下做計算,現在不論是在tangent space、clip space、view space都算滿得心應手的了。
雖然對OpenGL還是C++都滿陌生的,但寫了Unity這麼多年下來,很多觀念是可以轉換到這個renderer專案上的,基於個人的簡單原則,在實作各種功能時就是單純用array/std::vector放需要的資料,盡量一個for loop搞定所有事情,沒啥抽象化,除非真的膨脹到需要作抽象才去想抽象的架構設計。渲染的順序、材質球跟shader之間的相對關係則是參考Unity。
還有很重要的一點是不論是寫c++還是graphics programming卡關時,比起以前現在更有耐心,更能透過查找spec/reference來解決問題。
我還是很害怕cmake
學數學的近況…
一開始不知道從何下手,但後來discord上有人推薦khan academy,發現這網站的課程很適合我這種數學廢物,於是就挑了pre calculus(範圍大概是高中的多項式、三角函式、線代)跟微積分,從11月開始,每天寫完code之後晚上都在到這網站上算數學,目前剛學到微積分2的範圍,不過過程中測驗的成績就是有點悲劇就是了,有些時候腦袋不是很清楚硬去考那些小測驗就常會看錯題目或者算錯,有答錯就會讓最終成績都是黃黃橘橘的。
學數學的效果我覺得是很好,雖然我還是常常算錯,但起碼很多paper上的notation現在都看得懂,而且渲染的paper其實都是別人已經算好/證明出的算式,能看得懂notation並轉換為程式碼就很足夠了。如果沒特別要看paper的話,遊戲開發中大概97%的狀況,單純用線性代數課程中的數學就很足夠了。另外複習三角函式跟線代後寫shader也是順手很多。
複習三角函數之後突然對旋轉矩陣開竅了。
Graphics Programming的discord上有不少熱心的高手願意回答我的蠢問題,感謝他們。
打電動的進度
因為星期一到五白天都在瘋狂寫code跟看書,所以電動主要就是周末才有機會玩,但還是破了大概3.4款遊戲,依蘇8、破曉傳奇、噬血代碼、目前正在破宵星傳奇,破完宵星打算玩星際遊俠6,手賤還另外買了steam上的ps1老遊戲 - 【瑪魯王國的人形公主2】,看來要堆到明年才有機會玩到。
另外我要抱怨一下破曉傳奇的主角實在是太愛說教了,好囉嗦,然後宵星傳奇某些機能真的好….老
玩起來體驗最好的是伊蘇8,好想玩伊蘇10。
日文進度
最緊急的項目,但我準備的最消極…….是該調整一下時間分配,多花點時間背單字了,最近已經開始會看日文字幕的動畫,有字幕的話理解程度大概可以75%以上,然後看的時候試著用影子跟讀的方式念台詞。
因為腳色講話口闢少跟速度偏慢,葬送的芙麗蓮大概刷了兩次多,櫻桃小丸子除了裡面的豬太郎以外台詞也都滿正常的。主要就靠這兩部在保持語感,另外早上起床會看一下日本的新聞。最近發現在chatGPT上寫日文日記是一個學單字滿好的方式,有時候寫一寫,AI就會吐出一些沒看過的單字。
每周六有日語會話課,但我覺得我講得很爛,主要還是單字量太少的關係。
結論
這幾個月就是在專注在投資自己,不論是接案還是工作機會也都推掉了,給自己的壓力就是希望投資自己的效益需要大於之前每個月領的薪水,我從心底相信這對我的職涯來說是正確的。明年開始會調整一下時間分配,讓自己在著手開發下個付費shader插件的同時,還能不斷充實知識。














