1.1 研究背景
隨著電腦科技的演進,帶動了許多科學研究與產業的發展,其中在計算機圖 學這門學科中也隨著電腦效能日益強大,有了長足的進步,最明顯的地方就是,
早期電腦繪製的圖片都較為粗糙,不外乎因為電腦效能的問題,使得圖片的解析 度不足或是使用的模型中構成三角片的過少,然而,近年來電腦效能的提升,單 位時間的運算量大幅提升,繪製出來的圖片品質就較為精緻。
雖然藉由電腦繪製的圖片變得較為精緻,人們在大多數情況還是能夠分辨出 電腦繪圖與相片的差別,原因就在於電腦繪圖在渲染(rendering)時,運算所有場景 照明資訊是非常困難且耗時的工作,所以大部分只考慮了直接照明,即只把光源 當作主要影響場景亮度的因素,使得即使物體的顏色都繪製的正確,還是顯得不 真實,為了解決這個問題,也要把間接照明的影響考慮進來,除了光源之外,也 會考慮各條光線經過反射、折射等等的光學現象,讓電腦繪製的圖片可以更接近 如同相片拍出來的效果。
為了讓繪製的圖片更加真實,本篇論文採用光線追蹤(raytracing)的演算法,
是一種在電腦圖學中用於渲染的演算法,以物理的光學為基礎,推算出數學式子 來計算光的折射、反射、產生陰影等效果,以這種模仿光的自然現象之方法,讓 渲染出的場景更具真實性,然而,提升真實性的代價,就是必須大量運算光線追
蹤演算法中的數學公式,使得光線追蹤演算法相較於其他演算法渲染速度來的慢,
為了改善此缺點,使用開放式計算語言(OpenCL),在圖形處理器(GPU)上多核心 平行化運算,來處理龐大的計算量,同時也把模型的三角片資料中建立 BVH tree 的加速結構,藉由以上的加速方法,來縮短完成渲染工作的時間。
1.2 研究目的
OpenCL 是一個可以用來做平行計算的 API,用以處理光線追蹤演算法中龐 大的計算量,但實際應用後,可以發現 OpenCL 的內核(kernel)在撰寫時會有許多 限制,例如:無法動態宣告陣列、指標型態無法直接指向 OpenCL 實作的記憶體空 間(private、local、global)、函式無法遞迴呼叫等等…,函式無法遞迴呼叫和本研 究最為相關,本研究所撰寫的程式中,有使用到樹狀的加速結構,提到樹的資料 結構,就會牽涉到要如何拜訪樹的各個節點?即 tree traversal 實作方法,通常第一 個想到的都是使用遞迴來完成這個工作,但 OpenCL 實作上有所限制,不存在實 作遞迴最重要的堆疊(stack),因此,取而代之,就改用迴圈再加上自己宣告陣列 當作 stack 來模擬遞迴的行為,依序的拜訪節點來完成 tree traversal 的工作,讓加 速結構的功能發揮出來,然而這裡就遇到了一個課題,以往在使用 C++程式使用 遞迴呼叫時,系統會自動處理這些呼叫堆疊的工作,程式設計師只要注意不要讓 遞迴呼叫的深度過深,導致 stack overflow 即可,但前文提到了 OpenCL 有自己實 作的記憶體空間,為了模擬陣列而宣告的 stack 在 kernel 函式中,要宣告於何種
記憶體空間裡,是程式設計師可以選擇的,本論文就是研究在各個種類的 OpenCL 記憶體中實作 stack 以及改變一些參數來實驗使用到加速結構的程式,來觀察與 探討效能的表現與變化,供程式設計師在實作時的有所參考及幫助。
1.3 論文架構
該論文的第一章為緒論,會簡介研究背景、研究目的與論文架構,會說明整 個論文的大方向,以及為何會選擇這個主題做研究。第二章則為相關文獻探討,
會介紹到論文程式用的演算法與資料結構的一些內容,例如:Raytracing 演算法、
BVH-tree 加速結構,另外,還有幫助進行平行計算的 OpenCL 基本簡介、工作單 元分類、記憶體階層,再加上實驗硬體架構的相關資料,來幫助後面的實驗內容,
其數據能夠有合理的解釋。第三章為 Intel OpenCL Memory Model,會詳細介紹在
Intel 的硬體架構下,OpenCL 記憶體實作的細節,一樣做為解釋實驗數據的參考 資料。第四章為論文程式實作的各個步驟細節,主要分成四個步驟,從初始化程 式到繪製圖片的過程依序講解。第五章為實驗與數據分析,會提到所做的實驗,
並且對實驗數據有所討論。第六章會為整個論文做出結論與未來可以改進的方向。