近年來,出現了許多針對 GPU 硬體進行編碼的圖形 API: Direct3D、OpenGL、Vulkan、Metal、WebGL 等等。從這些 API 開始學習圖形學編程的話,可能會很難上手,因為它們通常需要很多「樣板代碼(boilerplate code)」,而且我認為它們根本不適合初學者。對於一個完全的圖形學初學者來說,使用這些 API,即使是「繪製第一個三角形」也是一項艱巨的任務。當然,我們也可以選擇使用 Unity 和 Unreal Engine 這樣的遊戲引擎。在這種情況下,遊戲引擎將為您完成與圖形 API 「對話」的繁瑣工作。但是我認為對於一個完全的初學者來說,即使是一個遊戲引擎也有太多的東西需要去學習,而這些時間應該花在一些更簡單的事情上。
因此,我建議初學者試著自己編寫 Raytracer 或 Software Rasterizer(或者兩個都試一試!)。簡單地說,Raytracer (對應光線追蹤)是一個這樣的程序:它通過從屏幕上的每個像素髮出光線來渲染 3D 場景,並進行大量的求交計算和物理光照計算,以計算出每個像素的最終顏色。而 Software Rasterizer (對應光柵化)呢,它是這樣渲染 3D 場景(這些場景在大多數情況下只是一堆 triangle,即三角形)的:對於每一個我們要在屏幕上繪製的三角形,我們先找出這個三角形涵蓋了屏幕上的哪些像素,然後對於其中的每一個像素,我們計算出光線是怎麼與這個像素對應的 三角形上的點進行交互的。通過這種光線的交互計算,我們得到了像素的最終顏色。光柵化要比光線追蹤快得多,也是現代 GPU 繪製 3D 場景的演算法。Software Rasterization 簡單的說就是我們在 CPU 上做這個 Rasterization,而不是在 GPU 上。
光線追蹤和光柵化實際上是兩種很簡單的演算法,對於初學者來說,實現它們要比理解現代圖形 API 容易得多。此外,通過親自實現這些演算法,初學者將了解計算機圖形學的許多基本概念,如點積、叉積、變換矩陣、攝像機等等,無需把時間浪費在與現代圖形 API 搏鬥。我相信這些圖形 API 已經勸退了許多圖形初學者,而把 Software Rasterizer 或 Raytracer 作為您的第一個圖形學編程項目是戰勝這個攔路虎的好方法。
我注意到,在學習圖形 API 之前先學著寫一個 Software Rasterizer,比起直接學習圖形 API 有一個巨大優勢——那就是在你使用 API 時,遇到錯誤你會感覺更容易 debug 了。因為這些 API 基本上只是提供一個到基於 GPU 的 Rasterizer 的介面,如果你知道了這些 API 在幕後是如何工作的(即一個 Rasterizer 是如何工作的),那麼 debug 代碼就會變得容易得多。
對於如何寫一個 Raytracer,我總會推薦別人去閱讀 Peter Shirley 撰寫的三本書(現已完全免費)。
我會在下面羅列一些優秀的線性代數學習教程。Immersive linear algebra 是一個優秀的在線版的數學書。Essence of linear algebra 是一個可以讓你可視化地學習很多概念的視頻系列。OpenGL tutorial 也解釋了一些簡單卻有用的線性代數概念。另一個優秀的學習資源是 Morgan McGuire 的 The Graphics Codex(譯者也強烈推薦,IOS 上可以找到同名 APP)。