• 沒有找到結果。

第二章 文獻探討

2.1 光線追蹤(Ray Tracing)

光線追蹤是一種模擬光線在空間中與物體表面所產生的互動軌跡行為表現,

以 Whitted Ray Tracer 模型[WHI 79]為例,其演算法流程為,一開始我們會利用 眼睛與螢幕上的各像素位置形成一個光向量,利用這些向量產生與像素同量的光 線。透過我們眼睛所發射出的光線與物體發生碰撞並且產生交點,再利用該點去 與光源形成直線,並尋找中間有無阻礙物,用以判斷該點是否會被光線照射到,

若屬於光照範圍內,由表面材質差異,可分為兩方向執行,首先我們傳入成像公 式計算該點與光反應後的正確顏色;其次,根據表面性質的不同,利用物理的反 射以及折射公式去產生新的一波光線,不斷地遞迴下去,最後再將所得的顏色收 集回傳當作該像素所得之最後顏色。這樣的一個將二維轉換成三維的向量運算過 程,我們稱之為光線追蹤。而利用該技術所呈現的光學效果,不管是畫面品質以 及精確度都是目前光柵化所難以達到的,故在一些追求比較高品質的動畫作品上,

都會利用這項技術,然而這樣的一個過程其中所需耗費的計算成本是非常昂貴,

故目前難以被用在遊戲這種需要即時互通的作品上。

本論文將取用這個過程中的兩個不同效果:基礎成像(使用 Phong lighting 成像效果)和反射(模擬環境反射效果)實行在 Shader 上用來與傳統的光柵化中 的 Phong shading 和 Cube Mapping 分別做比較。

2.2 GPU Ray Tracing

即時光線追蹤(Real-time Ray Tracing)一直以來是計算機圖學領域非常注重 的一個議題,而我們從現階段光柵化相關的進展,也都是利用這些相關原理,利

5

用 GPU 做一些內插計算,模擬出類似的效果。然而隨著近期 GPU 硬體突破性的 發展,使其不再侷限於固定式的功能性管道(function pipelines),隨而取代之的 是可編譯的 vertex 以及 fragment processors。這種新型的 GPU 是一種通用可編譯 的 stream processor。而在 fragment processor 上已經可以做一些簡單的平行化的動 作,所以在未發展出像 CUDA、OpenCL 等 GPGPU 語言的時候,已經有一群人 在研究如何將光線追蹤實行在 GPU 上。而為了有效地實行在當時的 GPU 上,必 須將光線追蹤分成下列幾個步驟,將這每步驟各分成一個獨立的 Shader,用以模 擬光線追蹤技術。

圖 2.1:Stream Processor 模型

此處為 Purcell 根據 Whitted Ray Tracer 所提出的 Stream Processor 模型,為了因應 GPU 硬體架構,

必須將這個流程,拆成一個個步驟,每步驟處理完後,必須要將最後結果寫入材質記憶體,當成 下一步驟的輸入資料。圖表來源可參見圖片來源(1)。

而為了因應 GPU 硬體上的一些限制,他們必須針對 Shader 的核心程式

(Kernels)、記憶體安排(Memory Layout)還有流程控制(flow control)做一些

6

改變。最主要的改變如圖 2.2[PUR 04]所示,必須將所在的體素(voxel)、三角片的 點、面資訊,透過材質記憶體(Texture Memory)[PUR 02]來傳給 Shader 使用。

而在當時因為一些硬體上以及 Shader 語言的一些限制,迫使它們必須將所有步驟 拆開,並且每步驟最後讀出值另外再寫入一個 Texture Memory,這過程非常繁雜,

而且沒有效率,Purcell 曾經提出在 2002 年想法,發展出了圖 2.1 的模型,可是當 時並沒有實際做出來成果,直到 2004 年利用當時一些特殊的 GPU 緩衝區,讓這 個理想得以實現。在他的研究裡,32 片三角片的 Cornell Box,可以達到 fps 大約 10.5 左右,而當時所使用場景的解析度大概有 256*256 左右,其效益並非非常理 想,推究原因,可能是當時的 GPU 並非成熟,而頻繁讀寫 Texture Memory 也是 一大問題。

本論文將延伸自他的想法,取其中場景利用 Texture Memory 處理的方式,但 針對這個方法去做一些探討,用以修改出比較快速的架構,並且將用單一 fragment Shader 取代他的頻繁讀寫多個 Shader,基於這兩項作出改善。

圖 2.2: Purcell 提出的場景儲存於 Texture Memory 的資料結構架構

Grid 和三角片的資料結構都會分別被存入材質記憶體空間裡。每個 grid cell 包含一個指標指到對 應的系列三角片資訊,如果指標為空,表示在該 voxel 裡,並無三角片的儲存。Grid Texture 存入 起始三角片位置會指到 Triangle List Texture,再根據這段所表示的頂點編號到 Triangle Vertex Textures 去找該頂點座標資訊。圖表來源可參見圖片來源(2)。

7

2.3 環境貼圖(Environment Mapping)

在光柵化中常用的反射環境的方法即是利用 Environment Mapping[GRE 86],

而我們這次將實現常見的 Cube Mapping[FER 03]的方法。這個方法將即是在 Shader 運作之前,即預先將上下左右前後等六面環境預先存入 Texture Memory,

而在 Shader 中我們只需要使用 SampleCube 這種特殊宣告模式即可將我們所傳入 的六張貼圖架設在我們的環境之中,而我們所需要做的即是算出反射光線,透過 查材質表的方式,即可近似出所要反射的環境貼圖。

圖 2.3:Cube Map 的材質貼圖示意圖。

而在光線追蹤中,我們也可以使用類似的方法就可以達成。我們預先將六張 圖寫入記憶體之內,並且將場景設置於這個貼上環境六張材質的正方體之內,只 要透過第二輪的反射光線追蹤即可做出這個效果。

8

相關文件