• 沒有找到結果。

第三章 研究議題與方法

第三節 多光源方法

第二章 文獻探討

本章節將介紹研究中有使用到的光跡追蹤以及多光源方法,由於多光源方法 衍生自即時輻射度,因此也會探討即時輻射度的相關文獻,接著會提到用來加速 光跡追蹤的加速結構 K-d tree,並介紹 OpenCL 的背景,最後列出 GPGPU 的相關 研究以及引擎。

第一節 光跡追蹤

電腦圖學的領域中主要有兩種渲染演算法,分別為利用傳統硬體加速的光柵 化(Rasterization)與光跡追蹤(Ray Tracing)。藉由傳統硬體加速的光柵化運算,雖 然繪製三角面的速度較快,但對於光照效果的實踐能力較差;而光跡追蹤演算法 則是藉由數學公式來計算光線折射、反射與各種變化來生成高品質的畫面,其缺 點則為程式計算量會較光柵化演算法龐大。

光跡追蹤演算法[Whi 79]是由攝影機所在的位置,朝投影平面發射光線,藉 由判斷是否擊中三維空間中的物體,以及擊中點與光源之間的關係來決定畫面中 每個像素(pixel)的顏色,如圖 2-1 所示。通常,每條射線必須測詴是否與場景(scene) 中的物體產生相交,一旦最接近的相交點被確定,光跡追蹤的演算法會檢查光源 在場景中相交點的材料特性,並結合多種資訊來計算該像素的最終顏色,一些進

6

階的光照演算法或特殊材質則會需要更多的光線來模擬真實場景。

當光線與場景中的物體相交時,可能會因為反射、折射與陰影的影響,而產 生相對應的光線。光線觸及光滑物體表面時,會沿著反射方向再度發射光線,所 以場景中與此光線相交的最近物體即為原物體上可看見的反射結果;而光線進入 或離開透明介質時會發生折射的現象,其光線方向決定於進入物體前介質的折射 率與物體本身的折射率,折射光傳回的顏色會再與物體的顏色做運算來得出最後 的結果。檢查物體是否會在陰影中的測詴可避免追蹤場景中所有的光線,若某光 線與物體間存在著不透明的物體,便可判斷該表面(surface)存在於陰影之中。上 述的光線計算方法可使得光線追蹤的影像更為真實。然而 Whitted 提出的演算法 雖能夠成功模擬直接照明,卻無法計算出間接照明(indirect lighting)的效果;而全 局照明除了考慮來自光源的光線,也會計算其他物體提供的光照,本研究使用的 多光源方法便屬於全局照明演算法的一種。

圖 2-1:光跡追蹤方法示意圖[Wiki 08]。

7

第二節 即時輻射度

即時輻射度為 Keller[Kel 97]提出的新演算法,首先會由光源產生許多粒子,

並基於 Monte Carlo 積分方法在場景中隨機遊走,接著圖形顯示卡會將每個粒子

equation[Kaj 86]

   

y r Le y r fr

i y r

  

L

h y i i

id i

其中 fr 為雙向反射分佈函數(Bidirectional Reflectance Distribution Function,

BRDF),定義了光線在不透明表面的反射情形,此函數通常和入射、反射方向的 輻射度與位置有關。

8

即時輻射度的方法與陰影貼圖(Shadow Map)一起使用時,這些虛擬點光源便 代表了場景中所有物體提供的間接照明。陰影貼圖是一種用於生成陰影的技術,

藉由與 z-buffer 或深度圖(Depth Image)進行比較來測詴各個像素是否可從光源的 角度被看見,並且儲存在材質貼圖(texture)中。而 Tabellion[Tab 04]證明了在即時 輻射度演算法中,粒子在場景中彈跳一次所渲染出的圖片已足夠模擬出真實世界 的光照效果。

本研究所使用的多光源方法衍生自即時輻射度,差別在於多光源方法通常不 會與陰影貼圖一起做計算,可以省去計算材質貼圖的時間。

第三節 多光源方法(Many-Light Methods)

多光源方法衍生自即時輻射度,可簡單分成兩步驟,如圖 2-2 所示:於圖 2-2(a) 中,先以光源為出發點向任意方向發射粒子,並在其與場景相交的地方設置新的 虛擬點光源(Virtual Point Lights,VPLs);在圖 2-2(b)中,則是以攝影機或是眼睛 為觀察位置,將第一步驟中所產生的虛擬點光源做為照明並藉此模擬近似間接照

9

虛擬點光源數量與其對場景中可見部分的光照貢獻不成比例,舉例來說,今有一 個相當大的場景,其內被設置了許多虛擬點光源,但因為攝影機擺放位置的問 題,可被看到的範圍只佔整個場景中的一小部分,其餘不在可見範圍內的虛擬點 光源便浪費了儲存空間與發射時間;此外當傳統虛擬點光源生成演算法追蹤到場 景中的凹幾何(Concave Geometry)時,其虛擬點光源的密度不足以真實地呈現相互 反射的效果。Georgiev 等人[Geo 10]提出了一個評估虛擬點光源貢獻程度的方式,

透過該演算法便不會將虛擬點光源設置在無法提供貢獻的地方。

(a) (b)

圖 2-2:多光源方法的兩個步驟。[Dac 13]

(a)生成虛擬點光源;(b)以虛擬點光源照明並模擬具間接照明的效果。

二、 利用虛擬點光源提供照明

傳統的多光源方法只能夠處理產生漫反射(Diffuse Reflection)的物體材質,當 遇到場景中有金屬或玻璃材質表面時,不正確的運算很可能影響到整個畫面的照 明,Hašan [Haš 09]等人提出了一個新的結構——虛擬球光源(Virtual Sphere Light,VSL),虛擬球光源能夠捕捉到虛擬點光源沒有考慮到的光線,進而消除原

10 方面進行加速的研究紛紛被提出。2002 年時,Harven[Har 02]提出針對路徑追蹤 設計來快速建造 K-d tree 的演算法,而在 K-d tree 尋訪(traversal)的各部份中,也 發展了許多種做法,如 Floyed[Flo 05]為了節省頻繁的記憶體使用所造成的延遲,

提出了 K-d restart、K-d backtrack,以及 Horn[Hor 07]提出的 short stack 等方法。

在 Horn 等人的實作結果中,可達到每秒鐘追蹤 15-18 百萬條主要光線(primary

rays)與 16-27 百萬條陰影光線(shadow rays),在當時的時代背景下是非常高的資 料計算量。

本研究渲染的場景屬於靜態場景(static scene),針對場景的加速結構採用了以

堆疊為輔的 K-d tree 加速結構,這部分將在下一章中做說明。

第五節 OpenCL

異質系統架構指在同一系統中,有兩種或兩種以上架構差異極大的計算裝

11

在 OpenCL 平台上,程式主要分為兩個部份:主機端(host)與裝置端(device),

主機端程式是屬於一般的 CPU 程式,而裝置端則是執行裝置內核程式(kernel

program),在 Single Instruction Multiple Thread(SIMT)的模式下,使用者能夠自已 決定平行化的程度並且藉此提升程式的效能。

另外,根據裝置端所使用到的不同架構,OpenCL 平台記憶體的宣告也分成 全域記憶體(Global Memory)、共享記憶體(Local Memory)與私有記憶體(Private

Memory)三種型態,其中全域記憶體是所有的內核執行緒(kernel thread)都能夠存 取的記憶體區塊,而共享記憶體可以和同一個工作群組(work group)共享資料,另 外,私有記憶體是只有單一內核執行緒能夠存取的區塊,後兩者存取的速度都較 所有內核執行緒能夠存取的全域記憶體快上許多。

第六節 GPGPU

GPGPU(General-Purpose computing on Graphics Processing Unit)的發展起源於 現代圖形處理器擁有可程式化流水線(Programmable Pipeline)進行平行處理的能

12

力,常被用來計算原先由中央處理器處理的通用計算任務,特別是 SIMT 的應用。

在以往光跡追蹤方法中,我們會利用多層迴圈大量且重複地套用相同的計算 公式來處理整個畫面,逐一對每個像素做相同模式的計算。若換成利用 GPGPU 的平行化能力,便可將工作分配給多個執行緒平行地完成工作,大幅減少運算所 需要的時間成本。

Purcell[Pur 07]在 2002 年首次提出完全在 GPU 上運行的光跡追蹤渲染器,其 在可程式化(programmable)的圖形硬體上搭配了標準網格(uniform grid)的加速結 構。而 Günther[Gün 07]提出了一個以 BVH 結構設計的 GPU 光跡追蹤器,並且使 用將光線打包(Ray Packeting)方法的平行遍歷演算法,利用 BVH 結構能夠突破在

GPU 上運算場景大小的限制。

近期的研究則以 GPGPU 的形式將光跡追蹤的計算平行化,Shih[Shi 09]的研 究為基於 CUDA 平台的光跡追蹤演算法,實現了基礎(Whitted-style)的光跡追蹤畫 面效果,且在特定場景中能夠達到每秒處理 30-43 百萬條光線的速度。由 Nvidia 所推出的可程式化光跡追蹤引擎 OptiX 採用了 Nvidia CUDA GPU 的計算架構,

Marques[Mar 10]等人探討了利用 OptiX 實作即時全局照明演算法的成果,證明了 結合三種優化演算法的確能夠達到互動式(interactive)渲染,但會犧牲掉畫面品質。

13

相關文件