2.1 光線追蹤
其實在計算機圖學的發展歷史中,光線追蹤(Ray Tracing)的概念大約從 1980 年代開始有了雛型,它的概念簡單來說就是模擬光線在現實中與物體的物理表面 所產生的行為,而成像原理是從眼睛發射出無數的視線,並且穿過在焦距上的假 想螢幕,所產生的光射線與會物體產生相交點,同時透過該點去與光源測試是否 有無照射到,來計算是否在陰影內,其後根據物體表面性質利用物理定律公式去 再產生新的折射光線或是反射光線,不停的傳播至光線的能量衰減,最後傳回這 些光所收集到的顏色並依照貢獻混色,最後成為在螢幕上的畫面。
雖然光線追蹤是解決全域照明中最廣為人知的方法,可以模擬出許多高品質 的光學效果(如下圖 2.1),會利用在要求高品質畫面和效果的動畫或電影裡,但如 此的模擬光的行徑路經之間的運算成本相當之大,對於記憶體使用量和運算時間 來說都是非常昂貴的。
圖 2.1:Ray Tracing 範例效果圖(左)、Ray Tracing 光線路徑圖(右)[WW93]
2.2 全域照明
全域照明(Global Illumination)說起來算是兩件事情的集合。第一指的是直接 照明(Direct Illumination),指的是單純只考慮光對物體的直接影響,最經典的算法 就是 Phong Model,簡化複雜的光線貢獻計算,可依照物體材質給予適當係數並 算出顏色。第二個就是間接照明(Indirect Illumination),指的是說環境中非光源的 其他物體所給予的照明,例如加上反射、折射和陰影的影響,但也有較嚴格的說 法是必須包含漫間反射(Diffuse Reflection)或焦散(Caustics)才行,如下圖 2.2 可見 到全域照明的效果。
為了計算出有全域照明的圖片已有許多討論與研究,例如高品質但需要長時 間運算的光線追蹤,其中有名的演算法有分布式光線追蹤(Distributed Ray Tracing)、
路徑追蹤(Path tracing)、光子映射(Photon mapping)等等;或是捨去物理的精確計 算,並求即時運算的 Reflective Shadow Map[DS05]、光傳播容積(Light Propagation
Volumes)[KD10]、Voxel Cone Tracing[CNS11]等等。
圖 2.2:全域照明的效果[Wiki 04]
2.3 遊戲引擎裡常用的全域照明
I. 光貼圖與光探頭:
在遊戲引擎中,為了節省運算時間並且達到全域照明,有個想法就是預先利 用光線追蹤的方法來計算物體所受到的光輻射,這種動作叫烘培(Bake),而計算 出來的資料可以用貼圖的資料結構儲存下來,就像一般的材質貼圖一樣,利用
UV 等等方法來紀錄對應的顏色,進而產生光貼圖(Light Maps),如下圖 2.3.1 是 受紅光的光貼圖。這種方法僅適用於靜態物體和光源,卻無法用於動態。
圖 2.3.1:光貼圖範例
後來就想到不如把光輻射儲存在空間中,並且當物體經過該區域時,再給予 光的貢獻,所以產生了光探頭(Light Probes)的想法,但光探頭與光源的概念不太
相同,光探頭可以由光源照射物體反射所產生,用來記錄周遭所受的光輻射;此 資料結構最常用的是球諧函數(Spherical Harmonics),是利用一群球狀函數來模擬 出原本光輻射對各個方向的貢獻,且每一層有不同形狀的球諧函數,如下圖 2.3,
每層中的每個相位都可以儲存一個變數代表它的強度,然後總合所有相位則可得 到光輻射的強度;但是此方法還是無法解決光源移動的問題。
圖 2.3.2:左圖球諧函數[Wiki 14]、右圖光探頭示意圖[Unity]
除了這兩個基本方法,依照不同的遊戲引擎會發展不同的光照格式和算法,
例如 Cube map、Lightmass 等等,都可以經過適當的設定來達到全域照明。
II. 複雜計算的全域照明方法:
為了達到即時運算且動態的全域照明,Unity 和 Unreal 都加入 Geomerics 所 做的 Enlighten 系統,有不錯的動態效果但是屬於 Pseudo Dynamic,因為不是重新 計算,而是用多次多角度的光照所內插出的結果。
後來就由 Crytek 的 CryENGINE 優先發展出真正即時計算的全域照明,並且 實作在遊戲引擎之中,叫做光傳播容積,後來 Unreal 也準備加入此演算法。之後
CryENGINE 又加入不同的方法,叫 Voxel-Based Global Illumination,該方法是基 於 Voxel Cone Tracing,而這系列的做法被 Sparse Voxel Octree Global Illumination
(SVOGI)演算法所深深影響,如下表 2.3。
Unity Unreal CryENGINE Light Maps、Probes
Enlighten
Light Map、Probes Lightmass
Light Propagation Volumes Enlighten
Light Boxes、Shapes Light Propagation Volumes Voxel-Based
表 2.3:各遊戲引擎的全域照明光照方法