在實作這個研究之前,有許多計算機圖學方面的觀念會運用到,包括最基本 的光柵化方式及光線追蹤方式,還有一些特定的效果,包括 Phong 光線照明法、
陰影和反射等等。根據這些繪製畫面的方法及特殊效果,基本上就完成了研究的 設定,以下就先來說明這些基本元素。
第一節 光線追蹤
光線追蹤(Ray tracing)如圖 2.1.1 所示,是跟蹤從眼睛發出的光線而不是 光源發出的光線,透過這樣一項技術生成編排好的場景的數學模型顯現出來。這 樣得到的結果類似於光線投射與掃描線渲染方法的結果,但是這種方法有更好的 光學效果,例如對於反射與折射有更準確的模擬效果,並且效率非常高,所以當 追求這樣高品質結果時候經常使用這種方法。
圖 2.1.1: 光線追蹤概念圖
"Ray trace diagram" by Henrik - Own work. Licensed under Creative Commons
在物理學中,光線追跡可以用來計算光線在介質中傳播的情況。在介質中傳播時,
光線可能會被介質吸收,改變傳播方向或者射出介質表面等。我們透過一些物理 的公式計算來算出透過介質中的情形以繪製出這種特殊的情況。
光線追蹤的管線圖如圖 2.1.2 所示,其演算法是從眼睛(相機)對螢幕上每個 像素打一條或數條光線,接著每條光線會對對應的幾何圖形單位,像是三角片,
做遍歷(traverse),然後利用交點判斷式(intersection)來判斷該光線是否有打到物 件,沒有打到物件則回饋背景的顏色,有打到物件則再繼續以該點發射光線連到 光源,如果途中有在打到其他物件則回饋出陰影的顏色或是折射反射的效果,否 則就根據與該光源的距離來算出該回饋顏色的比例值。
圖 2.1.2: 光線追蹤管線圖
第二節 傳統光柵化
傳統光柵化(Tradition Rasterization)是計算機圖學中最基本的繪圖方式,其常 見使用的語言為 OpenGL,他主要的方式是在場景中設定好相機、眼睛以及光線 的位置,接著讀入物件格式並且設定好三維空間的位置。光柵化是一個將三維空 間利用數個矩陣的轉換將其投影到二維的平面上來成像,其演算法會遍歷場景中 的每個物件,計算每個物件所覆蓋的像素並且儲存每個像素最近可看到物件的距 離。傳統光柵化的管線圖如圖 2.2.1 所示。
圖 2.2.1: 傳統光柵化管線圖
傳統的光柵化只是設定好基本的場景及畫面,其只能呈現最簡單的效果,如 果需要額外比較複雜的效果則需要用到 GLSL。GLSL,全名為 OpenGL Shading Language,是一個以 C 語言為基礎的高階著色語言。它是由 OpenGL ARB 所建 立,提供開發者對繪圖管線更多的直接控制,而無需使用彙編語言或硬體規格語 言。隨著近年來 GPU 的進步, 已在渲染管線中的頂點(vertex)和片斷(fragment)
層次中,加入更具彈性的新功能。圖 2.2.2-a 和圖 2.2.2-b 為 GLSL 的管線流程圖,
在 Host 端以 OpenGL 設定好場景物件、顏色及眼睛(相機)的位置之後,透過矩陣 轉換後將頂點資訊傳入 vertex shader 之中,定義好這些點的位置之後,將其資訊 傳入下個階段的 fragment shader 中,以這些頂點所在的範圍內進行直接著色或是 使用貼圖資訊來著色。
圖 2.2.2-a: Vertex Shader 管線圖
圖 2.2.2-b: Fragment Shader 管線圖
第三節 Phong Lighting
Phong 是計算機圖學領域中一項很基本的光線照明表示法,他主要結合多邊 形物體表面的反射光亮度,並以特定位置的表面法向量作為像素的參考值,以一 連串內插的公式來估算其他位置像素的顏色值。Phong Lighting 如圖 2.3.1 所示,
主要由 diffuse、ambient 和 specular 等元素所組成。
圖 2.3.1: Phong Lighting 示意圖
"Phong components version 4". Licensed under Creative Commons Attribution-Share
diffuse 是指物體在光源下實際表現的顏色值,指的是散射入射光的意思;
ambient 是指環境光,他影響物體的顏色會與光源的遠近強度有關;specular 是指 當入射光對物體產生全反射的情形,物體表面某區塊會呈現光滑亮點的模樣。
Phong Lighting 的光線相關圖如圖 2.3.2 所示,其公式為:
亮度 = Ambient + Diffuse + Specular = ka
I
a+ k
dI
dl · n + k
sI
s(v · r )
a其中 l 為入射光、n 為法向量、v 為射向眼睛的光線、r 為反射光。
圖 2.3.2: Phong Lighting 光線相關圖
Phong Lighting 雖然沒有像比較進階的全局照明及間接照明來的更趨近真實,
不過他的擬真程度已經遠大於 flat shading 和 gouraud shading 這兩種光線著色方 式,更符合光線在真實物理上的現象,其複雜度也略高於這兩種。
第四節 陰影
陰影(shadow),顧名思義就是物體的影子,產生陰影的方式有很多種,在傳 統光柵化搭配 shader 是用 shadow map 的方法,其主要就是先以光源為視點遍歷 整個場景,目的是取的每個物體相對於光源的深度圖(depth map),得到並儲存玩 深度圖之後,在 shader 方面再以眼睛或是相機為視點去搜尋整個場景,對每個 像素去計算他與光源的距離,接著比較這個距離與儲存的深度值,根據比較後的 結果去對光照做計算,方可得到陰影的效果。
另一個方法是光線追蹤所使用的 shadow ray 方式,當由眼睛發射的光線打到 物體時,他會與光源產生另一條連線,這條連線就是所謂的 shadow ray,這條光 線會去判斷有無與其他物體有交點,如果有則代表被該物體遮蔽到了,因此顏色 將會回饋為設定代表陰影的黑色,shadow ray 的方式比較是直觀從物理的角度去 直接模擬出來,shadow map 的方式相對會比 shadow ray 的方式稍快一些,因為
他只需要去查詢 texture table 而後者要去多追蹤一條光線,但是就真實與較直覺 的角度來看,後者會比前者好,各有其優點和缺點。
第五節 相關論文
將光線追蹤實作在 shader 上並且分析其效能的例子不多,大部分都是使用 CUDA 和 OpenCL。” Ray Tracing on Programmable Graphics Hardware
[PBM02]” ,內容是有關實作光線追蹤在 shader 上,其中他也是使用 texture memory 的方式來儲存三角片資訊,此篇研究有參考他的一些做法,像是 texture memory 的 3D-DDA 概念等等,不過該論文沒有分析其 FPS 和執行時間,不過以 當時 GPU 發展,其效能應該沒有很好。” RAY TRACING ON A STREAM
PROCESSOR [P04]”多測試了一些場景的效能分析,當時的 GPU 是使用 Radeon
9700,測試結果 cornell box 場景在解析度 256×256 的效能大約為 10.5fps,而此 篇使用的是 Nvidia GT650ti,測試結果相同場景跟解析度下速度可以達到 1000fps,
也就是 real-time 的效果,效能差距的結果除了因為演算法的使用有差異外,GPU 的影響也是很大的原因。” Ray Tracing on GPU [C05]”也是將光線追蹤實作在 shader,不過他使用的是 GLSL 和 HLSL,並不是單純全部由 GLSL 做,而且他 有加入 grid 的加速結構,測試的 GPU 為 GT 6800,在三角片數量為 2064、解析 度為 256×256 的情況下,其執行時間為 170ms,而此篇在 GPU 不同而其他條件 相同的情況下,執行時間大約為 23ms。