• 沒有找到結果。

使用圖形處理器模擬光線追蹤與光柵化成像畫面差異及速度之比較

N/A
N/A
Protected

Academic year: 2021

Share "使用圖形處理器模擬光線追蹤與光柵化成像畫面差異及速度之比較"

Copied!
46
0
0

加載中.... (立即查看全文)

全文

(1)國立臺灣師範大學 資訊工程研究所碩士論文. 指導教授:張鈞法. 博士. 使用圖形處理器模擬光線追蹤與光柵化成像 畫面差異及速度之比較 Image Quality and Performance Comparison between GPU Ray Tracing and Rasterization. 研究生: 中華民國. 莊沁傑 一○三. 撰 年. 七. 月.

(2) 摘要 使用圖形處理器模擬光線追蹤與光柵化成像 畫面差異及速度之比較 隨著快速的圖形處理器的問世,以及 GPGPU 語言的誕生,我們可以在圖形 處理器上做更複雜的計算。然而現階段卻少與有人願意使用圖形處理器模擬光線 追蹤這種高度模擬畫面的技術。我們推究原因是因為大部分的開發者認為使用光 線追蹤生成一張畫面的成本太高;此外因為 Shader 已經有許多強大且方便開發的 引擎,所以他們認為不需要再多學新的像 OpenCL 和 CUDA 的這類 GPGPU 語言。 為了達到我們的目的,我們提出兩種將光線追蹤實行在 Shader 上的方法: One Pass Rendering Algorithm 和 Hybrid Rendering Algorithm,也實作了 Phong Lighting 效果以及 Environment Mapping 效果,並且針對不同類型的場景與 Shader 上的光 柵化技術做畫面品質以及效能上的比較並且量化其結果。 我們展示兩個技術的差異以及解釋其優劣比較。雖然光柵化技術會比光線追 蹤技術來的快,但我們也無須擔心這樣的結果。因為增加的效果並不會造成兩個 技術的效能差距擴大。相反地,我們可以利用光線追蹤技術得到較好的畫面品質。 我們藉由這次實驗我們成功地將在圖形處理器上實行光線追蹤的可行性。. 關鍵字:圖形處理器、光線追蹤、光柵化、Phong 效果、環境貼圖。. I.

(3) Abstract Image Quality and Performance Comparison between GPU Ray Tracing and Rasterization With faster graphics processors and GPGPU languages, we have the ability to compute more complex data. However, we found few people want to simulate ray tracing on the graphics processor which can render high quality pictures. The developers think the cost of generating one frame is expensive by tracing rays. Besides, they are not willing to learn new GPGPU languages such as OpenCL and CUDA, because of the lack of powerful and convenient engines. In order to achieve that purpose, we offer two methods: One Pass Rendering Algorithm and Hybrid Rendering Algorithm to implement ray tracing on Shader and also implement the Phong lighting effect and the environment reflection effect. We compare the image quality and performance between rasterization and our Shader based ray tracing by different kinds of scenes and we also quantify the results of this comparison. We show the difference between GPU ray tracing and rasterization and we explain the pros and cons of them. The performance of rasterization is better than ray tracing, but we do not need to be worry about it. Because we do not get the larger performance gaps between GPU ray tracing and rasterization by increasing effects. On the contrary, we can gain higher image quality by using ray tracing technology. According to this experiment, we successfully prove the possibility of ray tracing simulation technology on GPU. Keywords: GPU, Ray Tracing, Rasterization, Phong lighting, Environment Mapping.. II.

(4) 目錄 摘要..................................................................................................................................I Abstract ......................................................................................................................... II 目錄.............................................................................................................................. III 附表目錄....................................................................................................................... IV 附圖目錄........................................................................................................................ V 第一章. 簡介................................................................................................................. 1. 1.1 1.2 1.3. 研究背景........................................................................................................ 1 研究目的........................................................................................................ 2 論文架構........................................................................................................ 3. 第二章. 文獻探討......................................................................................................... 4. 2.1 2.2 2.3. 光線追蹤(Ray Tracing) ............................................................................ 4 GPU Ray Tracing ........................................................................................... 4 環境貼圖(Environment Mapping) ........................................................... 7. 第三章. Shader 架構探討 ........................................................................................... 8. 3.1 3.2 3.3 3.4. Shader pipeline............................................................................................... 8 為什麼要使用 Fragment Shader? ................................................................. 9 Shader 相關硬體名詞解釋 ...................................................................... 10 GLSL 版本差異 ........................................................................................ 10. 第四章. 演算法設計與討論....................................................................................... 12. 4.1 4.2. One Pass Rendering Algorithm .................................................................... 12 Hybrid Rendering Algorithm ....................................................................... 15. 第五章. 實驗設計與結果討論................................................................................... 17. 5.1 5.2 5.3. 實驗環境與場景設計.................................................................................. 17 第一層基本 Phong 效果比較與討論 ......................................................... 18 第二層效果比較與討論.............................................................................. 27. 第六章. 結論與未來展望........................................................................................... 35. 參考文獻....................................................................................................................... 36 附錄 A:Möller intersection 程式碼 ......................................................................... 39 附錄 B:Phong 效果程式碼 ....................................................................................... 40. III.

(5) 附表目錄 表 4. 1:Cube Mapping 查表 Pseudo Code ................................................................. 16 表 5. 1:實驗環境與場景資訊表................................................................................ 18 表 5. 2:第一層畫面差異實驗方法............................................................................ 20 表 5. 3:Phong 效果成像圖表 .................................................................................... 21 表 5. 4:畫面差異度結果表........................................................................................ 21 表 5. 5:Car 場景畫面比較結果表 ............................................................................. 22 表 5. 6:演算法中會用到的浮點數指令與功能說明................................................ 23 表 5. 7:開放式場景速度結果表................................................................................ 24 表 5. 8:封閉式場景速度結果表................................................................................ 26 表 5. 9:環境貼圖效果畫面差異度結果表................................................................ 30 表 5.10:環境貼圖效果各種方法畫面差異比較結果表........................................... 32 表 5.11:環境貼圖效果速度結果表 ........................................................................... 33. IV.

(6) 附圖目錄 圖 1. 1:各種不同方法的環境反射成像圖.................................................................. 1 圖 2. 1:Stream Processor 模型 ..................................................................................... 5 圖 2. 2:Purcell 提出的場景儲存於 Texture Memory 的資料結構架構 .................... 6 圖 2. 3:Cube Map 的材質貼圖示意圖。 .................................................................... 7 圖 3. 1:Shader 運作概念圖 ......................................................................................... 8 圖 3. 2:Fragment Shader 與 OpenCL kernel 比較示意圖 .......................................... 9 圖 4. 1:One Pass Rendering Algorithm ...................................................................... 12 圖 4. 2:簡化版場景讀取架構圖................................................................................ 13 圖 4. 3:Phong reflection model 示意圖 ..................................................................... 15 圖 4. 4:Hybrid Rendering Method ............................................................................. 16 圖 5. 1:所要比較的 Shader based ray tracing 流程 .................................................. 18 圖 5. 2:所要比較的 Shader based Rasterization 流程 .............................................. 19 圖 5. 3:畫面差異公式................................................................................................ 20 圖 5. 4:畫面差異折線圖............................................................................................ 21 圖 5. 5:每片三角形指令數計算公式........................................................................ 24 圖 5. 6:開放式場景速度折線圖................................................................................ 25 圖 5. 7:封閉式場景速度折線圖................................................................................ 27 圖 5. 8:第二層效果執行示意圖................................................................................ 28 圖 5. 9:One Pass Rendering Algorithm 第二層流程表 ............................................. 28 圖 5.10:Hybrid Rendering Algorithm 第二層流程表 ............................................... 29 圖 5.11:Shader based rasterization 第二層流程表 .................................................... 29 圖 5.12:3DsMax2013 所產生的環境貼圖效果圖與環境貼圖 ................................ 29 圖 5.13:環境貼圖效果畫面差異折線圖................................................................... 30 圖 5.14:環境貼圖效果速度折線圖........................................................................... 34. V.

(7) 圖 1.1:各種不同方法的環境反射成像圖 由左至右分別為光柵化、One Pass Ray Tracing Rendering Algorithm、Hybrid Ray Tracing Rendering Algorithm 以及用 3Ds Max2013 所產生的環境反射成像圖。. 第一章 簡介 1.1 研究背景. 在計算機圖學發展中,從前人的腳步,我們可以歸納出兩個主要發展方向: 前者如動畫以及設計產業,致力於探討如何模擬出幾可亂真的畫面,舉凡如近期 上映的變形金剛 4 或者室內設計的模擬圖或者珠寶設計示意圖等,透過電腦的複 雜向量運算,可以模擬出複雜光線的效果,這領域主要局限於過高的計算成本, 通常一個畫面需要數分鐘、數小時的計算時間;後者以遊戲產業為主,將重心放 在如何快速畫出一個近似畫面,藉由硬體的加速,每秒可以達到 60 張以上畫面 以上的速度,這些畫面雖然沒有前者那麼精細,可是隨著現今中央處理器(Central Processing Unit,後簡稱 CPU)以及繪圖處理器(Graphic Processing Unit,後簡稱 GPU)的計算能力越來越強大,已經可以模擬出一定程度的畫面,現階段著名遊 戲引擎有常見的 Unity 3D 引擎、Cry 引擎以及 Unreal 引擎,這些引擎目前也透過 一些 Pre-Computed Texture 的方式,模擬出更高品質的畫面。 隨著現今硬體的發展越來越快速,我們相信追求快速產生高度模擬畫面的即 時全域照明(Real-time Global Illumination)勢必是未來必須討論的重要議題。. 1.

(8) 1.2 研究目的. 對於互動性與即時性的繪圖能力,我們第一個反應一定是遊戲產業中常用的 Shader 語言,現階段電腦遊戲中,舉凡如末日之戰(Crysis)系列、看門狗(Watch Dogs)等,都能即時呈現非常真實的光影效果,甚至現在也可以在移動裝置上高 度模擬的光影等效果如無盡之劍(Infinity Blade)這系列遊戲,。由這些作品我 們可以發現傳統的繪圖應用程式介面(API) ,如 OpenGL、DirectX 等,已經無法 滿足開發者的需求,現階段在 Shader 上所做的一些效果模擬,如 Relief Mapping 為例,已經可以看到光影追蹤(Ray Tracing)的影子,這種技術過去只會出現在 動畫產業上,而為了使畫面品質更加逼真,已經有許多移植過來的跡象。然而卻 沒有人願意完全使用這種技術,我們探究原因,主要有兩大限制,促使開發者不 願意去嘗試。首先是最主要的原因,計算成本過高,非常難以即時互動;其次, 即使可以使用類似 GPGPU 語言來做平行加速的方法,目前已經可以做到不錯效 益,但是因為開發環境沒有傳統 Shader 來的成熟,所以許多開發者也不願意再多 學新的語言來使用。 這篇論文想要以反向思考方式,我們知道 Shader 在 Fragment Shader 的階段, 利用 GPU 來平行處理像素的顏色計算,而光線追蹤本身就是個非常適合平行處 理的演算法,我們何嘗不想辦法將這項技術移植在 Shader 之上。這次,我們想要 探討兩點:第一,在 Shader 架構下,是否有方法移植成功,對於硬體的支援度、 成像(Render)速度以及畫面的品質會有什麼影響。本篇論文將用最基本的 Whitted Ray Tracer 作為移植模型;第二,我們會與傳統 Shader 的光柵化(Rasterization) 做速度以及畫面的比較,從中找出兩者之間的差距,歸納出一份分析報告。. 2.

(9) 1.3 論文架構. 本篇論文一共分為六個章節:第一章為簡介,說明本篇論文的研究背景以及 目的。第二章為文獻探討,主要針對所要移植的光線追蹤演算法做概論以及分析 過去在 Shader 上實行光線追蹤的研究,並且將所要實行的環境反射分別探討光柵 化以及光線追蹤實行的方法。第三章為 Shader 架構的討論,首先簡介 Shader 運 作的管線流程(pipelines) ,以及實行演算法的管線使用討論,再針對後續實驗所 需要用到的硬體名詞做解釋以及探討使用這些硬體名詞對於本篇論文的意義為 何,最後介紹我們所選用版本的 Shader,並且說明與過去版本的差異。第四章為 演算法設計與討論,首先會介紹,我們由 Purcell 所提出的架構,衍生出我們的第 一版 One Pass Rendering Algorithm,其次再提出我們結合 Shader 運作模式所發展 出的 Hybrid Rendering Algorithm。第五章,為我們實驗的設計與結果的討論,我 們將針對不同的效果以及場景,分別針對我們的兩個方法以及傳統 Shader 的光柵 化方法做效能以及畫面品質的評估,除了所測得的數據之外,我們亦會從硬體資 訊做一個理論的計算,綜合評估其結果合理性。最後一章,為結論與未來展望, 說明主要貢獻以及由目前的成果歸納出未來在 GPU 上實行光線追蹤技術的方 向。. 3.

(10) 第二章 文獻探討 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)一直以來是計算機圖學領域非常注重 的一個議題,而我們從現階段光柵化相關的進展,也都是利用這些相關原理,利. 4.

(11) 用 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)做一些. 5.

(12) 改變。最主要的改變如圖 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)。. 6.

(13) 2.3 環境貼圖(Environment Mapping). 在光柵化中常用的反射環境的方法即是利用 Environment Mapping[GRE 86], 而我們這次將實現常見的 Cube Mapping[FER 03]的方法。這個方法將即是在 Shader 運作之前,即預先將上下左右前後等六面環境預先存入 Texture Memory, 而在 Shader 中我們只需要使用 SampleCube 這種特殊宣告模式即可將我們所傳入 的六張貼圖架設在我們的環境之中,而我們所需要做的即是算出反射光線,透過 查材質表的方式,即可近似出所要反射的環境貼圖。. 圖 2.3:Cube Map 的材質貼圖示意圖。 而在光線追蹤中,我們也可以使用類似的方法就可以達成。我們預先將六張 圖寫入記憶體之內,並且將場景設置於這個貼上環境六張材質的正方體之內,只 要透過第二輪的反射光線追蹤即可做出這個效果。. 7.

(14) 第三章 Shader 架構探討 3.1 Shader pipeline. Shader 是一種在計算機圖學領域中,用來執行成像任務所使用的指令,Shader 主要是應用於利用 GPU 實現三維成像的可編譯流水管線(Programmable Pipeline), 而主要流程可參考圖 3.1,可分為兩個大步驟,一個是 Vertex Shader,在這個階段, 將我們在主程式所傳入的頂點、法向量等場景物體資訊,置放在空間中,並且利 用投影矩陣以及視角矩陣將物體投影在螢幕上,即將三維座標投影成二維座標的 過程,同時這個階段也會負責深度緩衝(Z-Buffer)的計算,光柵化後進入第二 階段 Fragment Shader,這個階段,主要處理來自光柵化後的數據,針對每顆需要 處理的像素利用 GPU 的多核心處理單元(即 Shader Unit) ,同時進行顏色成像計 算,而在此步驟即是一種平行加速的 GPGPU 語言最初原型,最後透過 GPU 的平 行運算將結果,回傳畫面到我們的螢幕上。. 圖 3.1:Shader 運作概念圖. 8.

(15) 3.2 為什麼要使用 Fragment Shader?. 由前文提到,我們知道光線追蹤因為是根據每條光線各自獨立做追蹤的動作, 所以是非常適合做平行化處理的演算法。而 Shader 中的 Fragment Shader,是接收 來自 Vertex Shader 不同的像素,各自獨立做顏色計算,這其實就是最初的 GPGPU 語言,但除了兩者剛好一個是適合平行化的程式,另一個是可以平行化的工具的 原因之外。Fragment Shader 除了可以接收來自上一階段所得的輸入資訊之外,它 本身還有額外的三個記憶體位置:材質記憶體、常數記憶體和暫存記憶體。前者 可以想像成之於 OpenCL[SAN 10]的 Global Memory,這是屬於所有 Kernels,即 Fragment Shader 共有讀取的部分,而後兩者比較類似 Local Memory 或者 cache 是比較屬於各 Kernel 或者 Workgroup 所共有。各自比照發現,其實 Fragment Shader 可以當成一個限制比較多的 OpenCL Kernel,所以光線追蹤在上面實行,理論上 是可以達到的。但兩者還是有一些差異,比如使用 Shader 時候的時脈,並不會等 於使用 OpenCL 時候的時脈。. 圖 3.2:Fragment Shader 與 OpenCL kernel 比較示意圖 左圖為 Fragment Shader 的記憶體架構,右圖為 OpenCL 的記憶體架構,兩者其實非常類似,我們 都可以找到彼此對應的記憶體空間。. 9.

(16) 3.3 Shader 相關硬體名詞解釋 . Shader Unit: 指的是 GPU 的核心數,即 GPU 在執行 Fragment Shader 成像時,同一時間可 以啟動幾個 Kernel 執行,通常 Shader Unit 會跟 OpenCL 或者 CUDA 的核心 數一樣多。. . Shader Clock Speed: GPU 執行 Shader 的時脈,這裡通常不會跟執行 OpenCL 或者 CUDA 的時候 一樣時脈,通常 Shader 的時脈會略低於使用 OpenCL 或者 CUDA 的時候。. . Fill rate: 指的是 GPU 平均每秒所能填的最大像素量,以 GP/S 為其單位。我們亦可從 這裡算出平均填一顆像素所可以執行的最大浮點數量,當作為光柵化的基本 處理能力,詳細請參照第 5.2.5 節的討論。. . Processing Power: 即 GPU 處理的能力,通常以 GFLOPS 為單位。我們將利用這個數值來推導 出我們演算法平均處理一片三角形,所需要的指令數,用來說明我們的演算 法合理性。. 3.4 GLSL 版本差異. OpenGL 和 GLSL 大約以 OpenGL 3.2 以及 GLSL1.4 為分水嶺[8],在這以前, 對於 OpenGL 提供了豐富的指令提供使用者傳遞參數,舉凡所需的矩陣、基本測 試模型和場景寫入記憶體的方法等等,而在 GLSL 裡面也是如此,對於由 OpenGL 所傳入的資訊只需要利用指令就可以直接運用,使用者無須再另外設定參數,然 而這樣的方式,雖然方便,可是對於一些額外的設定,還是需要使用者自行額外 去設定,其實做了一些沒必要的重覆動作,比如設定光源有光源的參數設定方法,. 10.

(17) 然而其實設定一個常數值,利用 Uniform 就可以傳入相關資訊了。所以在之後的 版本,將大量的指令都刪除。從這版本之後,矩陣需要自行計算,再設定為矩陣 常數值傳入 Shader;場景的讀入也非先前使用 glBegin 和 glEnd 指令,取而代之 的是利用 Vertex Array Object,分別將所需的頂點、法向量和顏色等資訊存成一條 陣列,傳入 Shader。 不過新版本也並非只有簡化指令,我們之所以選用新版的寫法,是因為對於 材質記憶體的使用方式也更加多元,過去來說,我們無法精確地抓到材質記憶體 內的浮點數內容,大多只能利用各家 GPU 各自提供的特殊指令或者模式來達到 這個工作。而新版本卻提供這個功能,可以讓我們不需要透過任何特殊硬體,去 達到抓取正確浮點數值的工作。這項功能可以使我們在 Fragment Shader 階段,可 以精確地抓取我們存於 Texture Memory 內的面、頂點等資訊。. 11.

(18) 第四章 演算法設計與討論 4.1 One Pass Rendering Algorithm. 我們發現網路上相關 Shader 上的光線追蹤(Shader Based Ray Tracing)都是 針對定義球去做各種效果,而比較有在討論關於物體的成像,主要是參考 Timothy 所提的演算法去做改善,但在嘗試過程中,我們發現他所使用的方法是屬於特殊 硬體限定的方法,對於一般硬體皆無法使用,再者演算法中所採用的多次記憶體 讀取與寫入,在使用效率上,也並非理想的方法,但將場景存入 Texture Memory 的想法,的確可以解決場景資訊在 Fragment Shader 無法讀取的問題,所以我們保 留這部分想法,提出一個新的一次執行方式,這次不再將每個步驟分開至不同的 Fragment Shader,減少讀寫 Texture Memory 的時間,另外我們所比對的 Shader, 是採用新版 OpenGL 3.3 之後的 Shader 的光柵化(Shader Based Rasterization) 。而 演算法的流程可以由圖 4.1 所示。. 圖 4.1:One Pass Rendering Algorithm 4.1.1 環境設定以及資料轉變 在主程式階段,我們必須設定相關的環境參數以及場景資料的存取。主要分. 12.

(19) 為三個步驟要執行。第一步,我們必須決定一個四邊形當作我們的螢幕屏,而之 所以要這麼做的原因,下一節會另外說明。其次,針對基本的環境變數,如眼睛、 光源利用 uniform 變數存入,再來針對新版的 OpenGL 3.3 之後的改變,我們必須 先自行計算投影矩陣以及視角矩陣,原因乃過去所用的 glMatrixMode 以及 glLookAt 相關指令已經無法使用。. 圖 4.2:簡化版場景讀取架構圖 最後也是最重要的部分,是我們將場景的面(faces) 、頂點(vertices) 、顏色 (colors)等資訊讀至一條陣列,再分別將它們各自存放在不同的 Texture Memory 中,而儲存的形態,我們也針對不同的狀況做一些測試。對於存放的記憶體維度, 在一萬片以內的場景,建議存放在一維材質記憶體,原因是存取速度較快,但缺 點是容量較小;而存取二維陣列之所以比較慢的原因是因為我們必須多幾段指令 判斷 Texture Memory 的所在的座標,但其容量倍率為一維寬度的平方。但是大於 萬片三角形以上的場景就建議使用二維材質記憶體。而所有材質的形態,我們建 議統一浮點數的形態,而不要有些是整數、有些是浮點數,是為了讓記憶體的資 料一致性提高。最後我們建議讓所有場景的值事先做正規化,最好使用 16 bit 的 記憶體長度,而盡量不要讓資料用到 32 bit 對於整體的速度又會有極大的影響。 4.1.2 設定視窗螢幕 與光柵化不同的地方,由於我們在 Fragment Shader 必須讀取到各像素的位置 用以與眼睛位置形成光線向量,所以在 Vertex Shader 的步驟中,我們從主程式所 傳入的我們所要畫的視窗四頂點資訊,與我們的投影矩陣和視角矩陣做相乘,透. 13.

(20) 過光柵化,內插計算出各像素的位置,再將當成 Fragment Shader 的輸入資料,用 以生成光線。 4.1.3 產生光線 我們透過主程式利用 uniform 傳入眼睛位置,並且與 Vertex Shader 所傳入的 像素位置形成一個向量,而透過 GPU 平行處理,即可生成與像素個數等量的光 線,在各自的 Fragment Shader 執行緒裡做光線追蹤的動作。 4.1.4 結構拜訪 我們在結構拜訪的這個步驟,並未加入如 Kd-tree 或者 Grid 等加速結構,我 們只單純利用循序的方式一一檢查各個三角片,找出最近的拜訪三角片。 4.1.5 計算相交點 利用 Möller–Trumbore ray-triangle intersection 演算法[MOL 05](詳細可參考附 錄 A)計算打到哪片三角形,並且回傳距離值,取最近的三角片當作其相交點,利 用該點去決定要做成像或者持續產生新的光線。這裡需要注意,我們獲取面以及 頂點的資訊方式是利用查 Texture Memory 的方式,我們必須透過上列圖 4.2 的結 構來抓取資訊,而這裡我們使用的是 texelftech 這個指令,原因是因為只有這個 指令可以正確地抓取精確的浮點數值,另外由於我們為了讓我們的 Texture Memory 一致性較高,我們面的存放型態亦是浮點數,這裡我們就必須轉換資料 型態,而這裡我們無法使用 C 語言的常用的轉換方式,我們必須在查表的時候就 強迫讀進去的是整數型態。轉換方式。有兩種方式:第一個用「ivec3」,即強迫 所宣告變數直接轉換成整數型態的向量;第二個方法,如「(int(faceNo.x))」,利 用括號將其轉換成整數型態。. 14.

(21) 4.1.6 Rendering 利用 Phong lighting[PHO 75]作為基底的成像方法。利用反射光及視角到頂點 的向量作內積,乘上係數,實作出鏡面反射光的效果。如圖 4.3,基本的 Phong reflection model 包含粗糙表面的散射光(diffuse)、光滑表面的鏡面反射光 (specular),並加上了場景當中所收集到少量的環境光(ambient)。. 圖 4.3:Phong reflection model 示意圖 散射光的密集度與光源的距離相關,specular 則因視角及光源角度影響,環境光源則為常數。圖 表來源可參見圖片來源(3)。. 4.2 Hybrid Rendering Algorithm 在 Shader 中,我們常使用 Image Space 的方法事先去產生一些圖,或者事先 將一些材質先行寫入 Texture Memory,等到顏色計算時,才利用查表方式去得到 相關資訊,用以快速計算最終近似顏色值。其實這個方式也可以混用在我們的 One Pass Rendering Algorithm。經由第一輪的光線追蹤後,我們可以得到精確的 intersection 點,結合事先存放在 Texture Memory 的資訊,我們也可以做近似計算 及查表,這樣的動作可以用來減少追蹤光線的次數,理論上可以加快一些速度。 修改後的演算法如圖 4.4 所示。而這演算法主要用在需要兩輪以上光線追蹤的效 果上,其第一輪與 One Pass Rendering Algorithm 其實是做一樣的事。. 15.

(22) 圖 4.4:Hybrid Rendering Method 我們盡可能只追蹤一次光線,而額外的效果,利用計算出材質座標來查詢 Texture Memory 用以達到同樣效果。不過有一個困難性。以 Cube Mapping 為例, 我們在查詢反射材質時,所使用的指令除了算出的反射光線,還需要結合 Vertex Shader 所傳入的近似點,找出反射的材質資訊。然而我們並無法直接使用這種查 表指令,因為我們使用的點並非這種 intersection 點,我們所得的近似點現在是該 像素的位置,為了克服這個問題,我們可以利用轉換座標方式,利用我們所算的 intersection 點,直接計算對應後的材質坐標位置,利用實際輸入座標查表的方式 取代特殊算出 Cube Mapping 的指令,如表 4.1。這種方法的核心價值是以查表取 代產生新光線,可以節省至少一輪追蹤以上的速度。 1. vec3 ReflectRay = reflect(IncidentRay, normal);. 2. vec3 TexelCoord = intersectionPos + EPS* ReflectedRay;. 3. Color += texture(CubeMap, TexelCoord); 表 4.1:Cube Mapping 查表 Pseudo Code. 16.

(23) 第五章 實驗設計與結果討論 5.1 實驗環境與場景設計. 在這測試環境中,我們盡可能讓 Shader based rasterization 以及 Shader based ray tracing 的條件一致,除了在同個環境以及硬體測試下,我們對於畫面的各項 數值以及演算法也都有詳細的規定,希望做到公平的測試條件。而詳細的規格可 以參考表 5.1 所列的資訊。 開發環境 作業系統. Windows 7. 編譯工具. Visual Studio 2010. OpenGL 版本. 3.3. GLSL 版本. 3.3 NVidia Nsight4.2、. 實驗分析工具 Microsoft Excel2010 GPU: NVidia GT650m 2GB DDR3 核心數. 384. 時脈數. 835MHz. 處理能力. 641.3 GFLOPS. Fill rate. 13.4 GP/S 場景資訊. 解析度. 600*600. 場景. 靜態. 眼睛、光源. 動態,可藉由滑鼠移動或者鍵盤指令而. 17.

(24) 做上下左右前後等位移動作。 均使用 face normal,而不使用 vertex 法向量計算 normal 去做近似或者 mesh 的動作。 表 5.1:實驗環境與場景資訊表. 5.2 第一層基本 Phong 效果比較與討論 5.2.1 Shader based ray tracing 與 Rasterization 的演算法比對 於我們前一章節所提的兩種方法,在第一輪光線追蹤,所使用的流程是一致, 其差異是在產生第二輪以後的光線,如果我們想做陰影,One Pass Rendering Algorithm 需要與光源產生陰影光線(Shadow Ray)進行下一輪的光線追蹤測試; 而我們的 Hybrid Rendering Algorithm 是在產生光線後,直接利用光線向量去計算 出近似的材質座標,再利用該座標資訊查詢 Texture Memory,用以達到近似的效 果。所以在第一層的追蹤動作中,兩個方法並無差異。我們此一節實驗,只區分 為 Shader based ray tracing 的方法與 Shader based rasterization 的方法做比較。而詳 細的運作流程,可以參照圖 5.1 以及圖 5.2 所示。. 圖 5.1:所要比較的 Shader based ray tracing 流程. 18.

(25) 圖 5.2:所要比較的 Shader based Rasterization 流程 5.2.2 畫面比對實驗設計 在第一層的畫面分析比較,我們想分析兩方法每個像素上的實質差異,並且 利用將兩方法的差異度量化,透過不同三角片數的差別,想了解,是否越複雜的 場景(在這裡我們指的是三角片數越多))所得的畫面差異越大。具體的實驗內容, 我們可參照表 5.2 所示,而我們使用的畫面比較場景為單一物體的開放式場景, 而我們所採用的 Phong 效果皆是使用 Per-Fragment 版本的 Phong 效果。 實驗方法. 逐步映對像素 RGB 值差異比較 即使從肉眼觀察兩者 Phong 效果的畫面幾乎沒什麼差異,我們還. 實驗目的. 是想透過實驗證明真的一樣,或者假使有些微差異,那麼差異又 是在哪裡? . 透過兩種方法分別生成畫面截取。. . 將兩種方法透過 Nsight 工具紀錄所有像素的 RGB 值。. . 透過程式將兩者圖中所對應的像素 RGB 值分別相減,取絕. 實驗步驟 對值,並且將 RGB 值相差值,取平均後當成該像素差異值, 而全部像素計算完後,再加總一次,取平均當成這場景的最 後差異比較數值,用來做後續結果討論。 會有兩者輸出: 實驗輸出. . 第一種輸出是透過圖像直接相減,取絕對值後,畫出來的畫 面差異圖,用以判斷位置上或者顏色上的差異。. 19.

(26) . 第二種輸出是由每對對應的像素差異取絕對值加總平均後 的差異度平均值,越高代表差異度越高,而詳細平均方法, 可以參考圖 5.3 所列的公式。. 我們會將物體填上顏色,利用顏色相減得到視覺差異。而顏色所 帶給我們的資訊,可以分成下列三種: . 黑色:代表是兩個相同顏色相減,這裡的結果就是位置與顏 色完全相同。. . 實驗. 與物體同色:可以預期這個情形是發生在物體邊緣,由於兩. 成像圖. 者方法所成像位置的些微差異,造成部分在像素沒有減到物. 說明. 體顏色,而呈現線狀的物體顏色,假如線條越粗,代表位置 差異越大。 . 為物體補色:這裡預期為 Specular 的位置會產生,由於 Specular 的強度位置不同,造成白色去與物體顏色相減程度 不同,而假如越接近補色代表,Specular 的位置差異越大。 表 5.2:第一層畫面差異實驗方法. The degree of difference . n. R  G  B. 1. 3. . n.  100%. 圖 5.3:畫面差異公式 n 為像素的個數、RGB 值的範圍,各為 0~1。將所要比對的兩個畫面對應的像素值 RGB 差值取絕 對值加總取平均,再算出整張畫面的平均差值,轉換成百分比,用以當成畫面差異度的數值。. 20.

(27) 5.2.3 畫面比對結果討論. 表 5.3:Phong 效果成像圖表 . 差異度數值分析討論 場景. Cube. Sphere. Teapot. Bunny. Car. 三角片數. 12. 120. 1,056. 4,968. 13,308. 差異度. 0.0255%. 0.0625%. 0.1187%. 0.4378%. 0.8269%. 附註. 三角片單位為個數,而畫面差異度單位為%。 表 5.4:畫面差異度結果表. 0.9 0.8. (. 0.7 差 異 0.6 度 0.5 單 位 0.4 : 0.3 % 0.2. 差異度. ). 0.1 0 0. 2000. 4000. 6000 8000 10000 三角片數(單位:個). 圖 5.4:畫面差異折線圖. 21. 12000. 14000.

(28) 由表 5.4 中的數值,我們可以知道在 Phong 效果之下,其實差異非常小,都 在 1%之下,而由圖 5.4 的折線圖,我們似乎可以歸納出畫面差異度會隨著三角片 數作線性成長。 . 差異圖畫面比較 由表 5.3 的 Phong 效果成像圖,我們很難以肉眼看出其中的差異,由表 5.4. 我們也只能得到 Shader based ray tracing 以及 Shader based rasterization 的差異都在 1%之下,但我們還是想找出,兩種方式之間的畫面差異,所以這裡我們將畫面差 異接近 1%的 Car 場景,當作來我們的討論例子。. 表 5.5:Car 場景畫面比較結果表 由表 5.5,我們發現經過兩個不同方式的畫面像素顏色值相減後,我們在 Car 這個場景勉強看到,在物體的邊緣,會有帶狀且與物體同顏色的點,這樣的結果 在我們的實驗設計的結果推論中,是屬於邊緣差異的現象,而之所以造成這個現 象,是由於兩種方式產生的 intersection 點的判定不盡相同。Shader based ray tracing 是經由光線的碰撞向量判定,而 Shader based rasterization 是經由 Vertex Shader 光 柵化後的近似點。 5.2.4 速度實驗設計 在速度的分析上,我們採用畫一張畫面的平均執行時間(Running time)當. 22.

(29) 成我們的測量標準,所使用的單位為毫秒(microsecond, ms) ,而我們所列的數值, 都是重覆測試 10 次後,所得的平均結果。在這個實驗中,我們分成三個部分來 討論。第一個部分針對我們所採用的演算法,做理論上的數據計算,我們將算出 平均畫一片三角形所需的指令數,對基本的演算法效能,先做初步討論;其次, 透過第 5.2 節畫面比較差異實驗所採用的開放式單一物體場景來當成我們第二組 實驗,用來比較 Shader based ray tracing 與 Shader based rasterization 之間的速度差 異;最後我們也會利用亂數生成三角片的場景當成我們的封閉場景,再做一次兩 者之間的速度差異比較,而分封閉式場景與開放式場景,我們在下節會一併討論 原因。 5.2.5 速度結果討論 . 基礎 Shader based ray tracing 演算法速度討論 本節我們將針對所選用的演算法,做浮點運算量的理論推導。以下是幾個我. 們演算法會使用到的浮點數運算指令: 算式. 功能. +,-,*,/. 加減乘除. >,<,==,!=. 邏輯判斷. 表 5.6:演算法中會用到的浮點數指令與功能說明 而在幾個我們會使用到的三種向量運算公式:內積、外積和正規化。內積需 要分別對 x、y、z 三維相乘,最後再經由兩次加總,將數值算出,所以總共需要 5 次浮點數運算。而我們的外積公式需要 6 次乘法運算、3 次減法運算,總共需 要 9 次浮點數運算;而正規化也需要 9 次左右的運算。而我們可以透過附錄 A 所 註明的說明,計算出我們所採用目前認為最好的 intersection 方法的 Möller 演算法, 使用一次需要 91 次的浮點數運算。由表 5.1 以及表 5.7 的數據,透過圖 5.5 的公 式,我們以 Bunny 這個場景為例子:我們的 GPU 處理能力為 641.3GFLOPS、Bunny. 23.

(30) 成像時間為 437.36 毫秒、解析度為 360,000,而三角片個數為 4968,所以我們可 以得到平均每片三角形需要 156.83 次浮點數運算,而 intersection 方法占了整個演 算法大約 58.02%,所以其實我們所採用的演算法本身已經相當精簡。 Max.  time GFLOPS FLOP / triangle  Triangle pixels  Number. 圖 5.5:每片三角形指令數計算公式 . 開放式場景速度比較 在此處之後的表格或者圖表,為了版面的簡潔,我們會將 Shader based ray. tracing 簡稱為 SBRT、Shader based rasterization 簡稱為 SBRN。 場景. Cube. Sphere. Teapot. Bunny. Car. 三角片數. 12. 120. 1,056. 4,968. 13,308. 1.50. 11.70. 106.33. 437.36. 1274.63. 0.5. 1.5. 1.5. 1.5. 2.0. SBRT 執行時間 SBRN 執行時間 附註. 三角片單位為個數,而執行時間單位為毫秒。 表 5.7:開放式場景速度結果表. 24.

(31) 1400. (. 1200 執 行 1000 時 間 800 單 位 600 : 毫 400 秒 200. SBRT SBRN. ). 0 0. 2000. 4000. 6000 8000 10000 三角片數(單位:個). 12000. 14000. 圖 5.6:開放式場景速度折線圖. . 開放式場景速度結果討論 我們由圖 5.6 可以發現對於 Shader based ray tracing 的執行時間,幾乎是隨著. 三角片呈現線性成長,然而對於 Shader based rasterization 卻是幾乎呈現水平線的 狀態。Shader based ray tracing 之所以呈現線性成長,是因為我們所使用的演算法 並沒有成功實作出加速結構,所有程式速度的負擔就在拜訪三角片的過程,而這 裡在我們前面基礎演算法的討論,也可以發現我們判斷 intersection 點佔據整個程 式約 58.02%的運算量,而少了加速結構將會使這個部分判斷量的比重又更大。然 而,我們對於 Shader based rasterization 並不會隨著三角片數增加而感興趣。我們 由 rasterization 的運作流程中知道,在我們測試的開放式場景中,黑色部分在光柵 化的過程已經被忽略掉,然而 Shader based ray tracing 卻還是需要追蹤一輪,才可 以判定不需要填顏色,這是第一個差異;其次光柵化過程經由 Z-Buffer 作用後, 只會畫出物體的前端,然而 Shader based ray tracing 卻需要所有物體的面都做判斷。 不只如此,我們可以透過表 5.1 中的 GPU 處理能力以及 fill rate,假設沒有其他因 素之下,GPU 每秒填 134 億個像素(即 fill rate)等價於 GPU 處理每秒 6413 億次浮. 25.

(32) 點數運算(即 GPU 處理能力) ,我們可以推算出我們的 GPU 平均每處理一個像 素最多可以執行 47.86 次浮點數運算,而 Shader based rasterization 中的 Fragment Shader 執行 Phong 效果,可由附錄 B 註解說明得到約略有 77 次浮點數運算。加 上我們實際要填的像素在這些場景也只占了 7.708%(這數據是在前面畫面分析中, 順便計算得到),所以實際上由比例大概只需要執行 6.01 次浮點數運算。上述幾 個原因可能是兩種方法差距這麼大的原因。 . 封閉式場景速度比較 由於我們前面所測試的場景,比較適合 Shader based rasterization,可是並不. 是所有場景都是這種開放式場景。本段我們想來探討一種不同的場景:遊戲的地 城式場景。這種場景因為屬於封閉式,所以畫面上每一個像素都需要填滿,而我 們這裡的實驗因為並沒有取得實際遊戲地城場景,所以我們採用亂數生成三角片, 使其畫面盡量由三角片填滿,用以達到每個像素均使用到。用以達到跟封閉式場 景差不多的基礎。在這裡我們一樣分別比較兩種演算法的差異。 三角片數. 100. 500. 1,000. 5,000. 10,000. 5.5. 27.5. 58.5. 292.5. 735.3. 2.5. 10.5. 22.5. 127.5. 260.5. SBRT 執行時間 SBRN 執行時間 附註. 三角片單位為個數,而執行時間單位為毫秒。 表 5.8:封閉式場景速度結果表. 26.

(33) 800. 執 700 行 600 時 間 500 ( 單 位 : 毫 秒. 400 SBRT 300. SBRN. 200. ). 100 0 0. 2000. 4000. 6000. 8000. 10000. 12000. 三角片數(單位:個). . 圖 5.7:封閉式場景速度折線圖 封閉式場景速度結果討論 由圖 5.6 以及圖 5.7,我們已經可以看出的確在所有像素均填滿之下,兩者的. 差距已經拉近許多。我們可以進一步在表 5.8 中發現在 10,000 片的數據中差距最 大也只有 2.82 倍差距,相對於開放式場景的差不多片數(這裡用 Car 場景,約 13,308 片)卻有 637.32 倍差距,已經小很多,這實驗告訴我們,其實其實在每一個像素 都需要做計算之下,Shader based ray tracing 其實跟 Shader based rasterization 速度 差距在 10,000 片左右,不會超過 3 倍。. 5.3 第二層效果比較與討論. 本節,我們將討論第二輪光線效果的比較,我們以環境反射貼圖為測試效果。 由前一節,我們已知在第一輪的 Phong 效果測試中,兩者畫面幾乎沒什麼差異, 而速度卻已經有一些差距,我們這個實驗想探討,假如再加一層效果上去,畫面 以及速度會有什麼影響,會不會兩者速度差距越多?而此處,我們在 Shader based ray tracing 會演變成兩種方法:One Pass Rendering Algorithm 和 Hybrid Rendering. 27.

(34) Algorithm。在第 4.2 節中以及第 5.2.1 節都有強調過,Hybrid Rendering Algorithm 與 One Pass Rendering Algorithm 的差別在於第二輪生成的光線,不再去做追蹤的 動作,而是透過座標轉換的計算,以及查詢 Texture Memory 來做到同樣的工作, 以下我們將對演算法以及實驗設計跟結果分章節做討論。 另外有一個細節在此說明,為了公平以及方便比較,我們在這實驗中,第一 層只對 Diffuse 做 Rendering 圖 5.8 表示,將第一層塗上白色,當成白模,用以收 集反射環境所得的顏色。在此處之後的表格或者圖表,為了版面的簡潔,我們會 將第一種 One Pass Rendering Algorithm 的方法簡稱為 One-Pass、第二種 Hybrid Rendering Algorithm 簡稱為 Hybrid,而 Shader based rasterization 維持簡稱為 SBRN。 而 5.3.1 節為測試的三種方法運行過程。. 圖 5.8:第二層效果執行示意圖 中間環境貼圖來源可參見圖片來源(4)。(本圖為了示意表現,已對原環境貼圖做了傾斜的動作。). 5.3.1 第二層三種演算法比對. 圖 5.9:One Pass Rendering Algorithm 第二層流程表. 28.

(35) 圖 5.10:Hybrid Rendering Algorithm 第二層流程表. 圖 5.11:Shader based rasterization 第二層流程表 5.3.2 畫面比對實驗設計 本節的畫面差異實驗,主要與第 5.2.2 節的比較方式一樣,但比較的對象不 一樣,我們嘗試利用較專業的建模軟體(這裡我們採用 3DsMax2013 教育版)繪 製出差不多視角的圖,因為軟體的座標系跟參數設定很難都一致,但我們盡可能 將我們會用到的參數調成一致,利用這張圖來分別與我們三種方法比對,作為一 個量化的標準。由前面一個實驗比較我們知道 Shader based ray tracing 以及 Shader based rasterization 的位置其實沒甚麼差異,這裡我們只想了解再加一層效果上去, 物體內的顏色是否會有差異,所以我們不畫出背景,而流程圖,可由圖 5.12 所示。. 圖 5.12: 3DsMax2013 所產生的環境貼圖效果圖與環境貼圖 由左至右,由上至下分別為,3DsMax2013 的成像圖、前、後、左、右、上和下等 6 張環境貼圖。 環境貼圖來源可參見圖片來源(4)。. 29.

(36) 5.3.3 畫面比對結果討論 場景. Cube. Sphere. Teapot. Bunny. Car. 三角片數. 12. 120. 1,056. 4,968. 13,308. 2.64%. 2.26%. 1.02%. 2.85%. 2.30%. 2.66%. 2.28%. 1.03%. 2.86%. 2.31%. 2.79%. 2.98%. 1.30%. 3.06%. 2.55%. One-Pass 差異度 Hybrid 差異度 SBRN 差異度 附註. 三角片單位為個數,而差異度指的是畫面差異度,單位為%。 表 5.9:環境貼圖效果畫面差異度結果表. 3.5 3. 差 異 2.5 度 (. 2. 單 位 1.5 : 1 %. One-Pass Hybrid SBRN. ) 0.5 0 0. 2000. 4000. 6000. 8000. 10000. 12000. 14000. 三角片數(單位:個) 圖 5.13:環境貼圖效果畫面差異折線圖 我們由圖 5.13 以及表 5.9 中可以發現 Hybrid Rendering Algorithm 以及 One Pass Rendering Algorithm 大致上畫面差異度不大,大約在 0.02%之下,而兩種方 法與 Shader based rasterization 兩者之間的差距約在 0.2%。其中 Sphere 這個場景 兩種演算法與 Shader based rasterization 的差距最大,大約在 0.7%左右。然而由圖. 30.

(37) 5.13 的折線圖,畫面的差異與三角片數並沒有太大關係,最主要的差異在於反射 後所要填的環境貼圖,可能因為三種計算方式的不同,而有所差異。在我們的這 個實驗結果來看,One Pass Rendering Algorithm 畫面最好、Hybrid Rendering Algorithm 與其相差不遠,而 Shader based rasterization 會與前兩者大約有 0.2%左 右的差距。 接下來,由表 5.10 所示,我們將拿畫面品質最高的 Teapot 場景以及 Ray Tracing 的兩個版本與 Rasterization 版本差異最高的 Sphere 場景來做討論。 Teapot 場景 版本. 成像畫面. 差異圖. SBRN. One-Pass. 31.

(38) Hybrid. Sphere 場景 版本. 成像畫面. 差異圖. SBRN. One-Pass. Hybrid. 表 5.10:環境貼圖效果各種方法畫面差異比較結果表 表 5.10 可以看到幾個現象,因為我們都使用 face normal 的關係,所以對於. 32.

(39) Shader based rasterization 較不利於做近似內插查詢 Texture Memory,尤其是每片 三角形邊界會有一些不自然的情形發生,再來就是三角片面積越大,情形就越嚴 重(由 Sphere 場景得知) ,這只能利用 Vertex normal 去做改善;而由於我們的 Ray Tracing 版本的兩種演算法都有抓到確切的 Intersection 點,所以不管是多一輪去 追蹤或者直接查表,即使因為 face normal 的關係下,兩個方法的成果都還可以。 但由差異圖來看,誤差都發生在在於反射環境貼圖正方體空間邊界附近,這可能 是我們並沒有邊界做特別處理,所以導致這樣的誤差產生。 5.3.4 速度實驗設計 此節的實驗設計與第 5.2 節完全相同,但是 Shader based ray tracing 因為第二 輪的計算方式不同,我們將拆成兩種方式:One Pass Rendering Algorithm 以及 Hybrid Rendering Algorithm 用來與 Shader based rasterization 比較。 5.3.5 速度結果討論 場景. Cube. Sphere. Teapot. Bunny. Car. 三角片數. 12. 120. 1,056. 4,968. 13,308. 3.5. 16.33. 116.2. 504.2. 1496.5. 1.8. 13.3. 108.5. 439.73. 1277.4. 1.5. 1.75. 2.5. 3.5. 5.2. One-Pass 執行時間 Hybrid 執行時間 SBRN 執行時間 附註. 三角片單位為個數,而執行時間單位為毫秒。 表 5.11:環境貼圖效果速度結果表. 33.

(40) 1600 1400 執 行 1200 時 1000 間 ( 單 800 位 : 600 毫 400 秒. One-Pass Hybrid SBRN. ) 200 0 0. 2000. 4000. 6000 8000 10000 三角片數(單位:個). 12000. 14000. 圖 5.14:環境貼圖效果速度折線圖 由圖 5.14 我們可以得知,Hybrid Rendering Algorithm 會比 One Pass Rendering Algorithm 快一些,而這差距會隨著三角片增加而變大,在 13,308 片三角形的這 個場景,Hybrid Rendering Algorithm 比 One Pass Rendering Algorithm 快了 1.17 倍, 但整體上還是與 Shader based rasterization 有一段差距,這差距的主要原因還是因 為沒有加速結構的關係。不過由這個實驗可以得知,Shader based rasterization 即 使在 Phong 效果畫面幾乎與 Shader based ray tracing 一致,且速度快很多。但只要 再多一輪效果計算,兩者的畫面品質就漸漸的隔開,而兩者的速度卻會慢慢接近, 不管是使用 One Pass Rendering Algorithm 或者 Hybrid Rendering Algorithm。而在 Shader based ray tracing 的兩種演算法中,我們發現 Hybrid Rendering Algorithm 這 種方法透過查 Texture Memory 方法,由於我們在第一輪還是可以得到確切 intersection 點,所以畫面品質並不會下降太多,卻可以節省部分光線追蹤的次數, 在評估過後,Shader based ray tracing 在增加效果的這件事上,可以試著使用這種 方法來實行。. 34.

(41) 第六章 結論與未來展望 本篇論文主要貢獻為將光線追蹤技術移植到 Shader 一般化,不必再侷限於特 殊硬體,且提出兩種不同的演算法:One Pass Rendering Algorithm 和 Hybrid Rendering Algorithm。兩種演算法在第一輪上光線追蹤上並沒有什麼差別,主要 差別在於第二輪之後,Hybrid Rendering Algorithm 可由第一輪所產生的 intersection 點與事先計算儲存在 Texture Memory 的資訊做近似值的計算,用以節 省多次光線追蹤的時間成本。其次,我們將實驗分成只有單純一輪光線追蹤的 Phong 效果以及需要兩輪光線追蹤的 Environment Mapping 效果,分別跟對應 Rasterization 版本做畫面以及速度上的比較。 在這次比較中,我們在第一輪的 Phong 效果,可以得知我們的 Shader based ray tracing 因為沒有加速結構,加上 Shader based rasterization 會隨著硬體以及 Shader 管線的一些優勢,導致兩者之間的差距會隨著三角片數而加大,但畫面是沒什麼 差異的。在第二輪的 Environment Mapping 效果實驗中,我們得知再加效果上去, 畫面差異會漸漸出來,且 Shader based ray tracing 品質會比較好,而速度雖然還是 會隨著三角片數增加而差距變大,但會發現兩者的距離已經拉近許多。而 Shader based ray tracing 的方法中,結果呈現 Hybrid Rendering Algorithm 雖然畫面品質會 比 One Pass Rendering Algorithm 差一點,但速度會快許多。 然而,我們未來還要針對兩個部分下研究,才能提供一個更完整的成果說明。 第一,我們必須研究如何有效地在 Shader 上建構加速結構;第二,我們必須做更 多更複雜的效果來測試討論 One Pass Rendering Algorithm 及 Hybrid Rendering Algorithm 的使用時機,用以做更多方面的測試,訂定一套使用的標準。. 35.

(42) 參考文獻 相關研究論文 [CHR 05]. Christen, M. (2005). Ray Tracing on GPU. Master's thesis, Univ. Applied Sciences Basel(FHBB).. [FER 03]. Fernando, R., & Kilgard, M. J. (2003). The Cg Tutorial: The definitive guide to programmable real-time graphics. Addison-Wesley Longman Publishing Co., Inc.. [GRE 86]. Greene, N.(1986)Environment mapping and other applications of world projections.. [KEP 08]. KEPLER, J. (2008)Real–time Ray Tracing of Dynamic Scenes.. [MIC 07]. Michael, B. (2007). Shadow Map Antialiasing. GPU Gems.. [MOL 05]. Möller, T., & Trumbore, B. (2005, July). Fast, minimum storage ray/triangle intersection. In ACM SIGGRAPH 2005 Courses (p. 7). ACM.. [PHO 75]. Phong, B. T. (1975). Illumination for computer generated pictures. Communications of the ACM, 18(6), 311-317.. [PUR 02]. Purcell, T. J., Buck, I., Mark, W. R., & Hanrahan, P. (2002, July). Ray tracing on programmable graphics hardware. In ACM Transactions on Graphics (TOG) (Vol. 21, No. 3, pp. 703-712). ACM.. 36.

(43) [PUR 04]. Purcell, T. J. (2004). Ray tracing on a stream processor (Doctoral dissertation, stanford university).. [SAN 10]. Sanders, J., & Kandrot, E. (2010). CUDA by example: an introduction to general-purpose GPU programming. Addison-Wesley Professional.. [WHI 79]. Whitted, T. (1979). An improved illumination model for shaded display. Proceedings of the 6th annual conference on Computer graphics and interactive techniques.. 相關研究網頁文獻 [1]. Evan Wallace(2010),WebGL Path Tracing, Retrieved from : http://madebyevan.com/webgl-path-tracing/. [2]. Emmanuel Agu.(2013). Lecture 9(Part1): Environment Mapping(Reflections and Refractions),Retrieved from WPI Computer Graphics(CS 543) Courses: http://web.cs.wpi.edu/~emmanuel/courses/cs543/f13/slides/lecture09_p1.pdf. [3]. Friendrich A. Lohmuller(2013). Cubic Environment Mapping A Skybox with cube mapping. Retrieved from POV-Ray Tutorial: http://www.f-lohmueller.de/pov_tut/backgrnd/p_sky9.htm. [4]. Favien Sanglard(2009) Soft shadow with GLUT, GLSL and VSM. Retrieved from Favien Sanglard’s website: http://fabiensanglard.net/shadowmappingVSM/index.php. [5]. GLSL Tutorial(n.d.), Retrieved from lighthouse3D: http://www.lighthouse3d.com/tutorials/. [6]. GPU Ray Tracing(n.d.), (2013) Retrieved from : http://micah-d-lamb.com/blog/opengl-tutorials/gpu-ray-tracing-2/. [7]. Jerome Guinot.(2006).Environment Mapping, The Art of Texturing Using The OpenGL Shading Language, Retrieved from oZone3D.Net: http://www.ozone3d.net/tutorials/glsl_texturing_p04.php. [8]. Khrons group(2013)OpenGL 4 Reference API Card, Retrieved from. 37.

(44) http://www.khronos.org/files/opengl44-quick-reference-card.pdf. [9]. Resle(2010)Shadow mapping on GLSL 1.5 avoid deprecation. Retrieved from gamedev.net: http://www.gamedev.net/topic/573885-shadowmapping-on-glsl-15-avoiding-deprecation/. [10] NVIDIA Corporation. (1999). OpenGL Cube Map Texturing. Retrieved from NVIDIA: http://www.nvidia.com/object/cube_map_ogl_tutorial.html. 相關圖片來源 (1). 圖 2.1 圖片來源:"Figure2 A streaming ray tracer" Licensed under Creative Commons Attribution-Share Alike 3.0 via Purcell, T. J., Buck, I., Mark, W. R., & Hanrahan, P. (2002, July). Ray tracing on programmable graphics hardware. In ACM Transactions on Graphics (TOG) (Vol. 21, No. 3, pp. 703-712). ACM.. (2). 圖 2.2 圖片來源:" Figure 4: The grid and triangle data structures stored in texture. memory. " Licensed under Creative Commons Attribution-Share Alike 3.0 via Purcell, T. J., Buck, I., Mark, W. R., & Hanrahan, P. (2002, July). Ray tracing on programmable graphics hardware. In ACM Transactions on Graphics (TOG) (Vol. 21, No. 3, pp. 703-712). ACM.. (3). 圖 4.3 的圖片來源:"Phong components version 4". Licensed under Creative Commons Attribution-Share Alike 3.0 via Wikimedia Commons http://commons.wikimedia.org/wiki/File:Phong_components_version_4.png#mediaviewer/File:Ph ong_components_version_4.png. (4). 圖 5.8 以及圖 5.12 的圖片來源:" Långholmen ". Licensed under a Creative Commons Attribution 3.0 Unported License via Emil Persson, aka Humus -http://www.humus.name/index.php?page=Textures&ID=48.. 38.

(45) 附錄 A: Möller intersection 程式碼 演算法. 浮點運算次數. float triangleIntersection(vec3 rayOrgin,vec3 rayDir, int i) { (xyz)*1 次 fetch, 讀取 face Texture 得到 face number 總共 3 次 (xyz)*3 個頂點*(讀出 分別在三角形中的三頂點資訊讀出,並且轉換成整 +轉換+fetch), 數型態,再讀取 vertices Texture,得到 vertex 資訊。 總共 27 次 vec3 e1 = PointB - PointA;. (xyz)*1 次減法=3 次. vec3 e2 = PointC - PointA;. (xyz)*1 次減法=3 次. vec3 n = cross(rayDir , e2);. 總共 9 次. float a = dot(e1, n);. 總共 5 次. if(a > -0.00001 && a < 0.00001). return EPS;. >,<,&&,總共 3 次. float f=1/a;. /,總共 1 次. vec3 s = rayOrgin - PointA;. (xyz)*1 次減法=3 次. float u = f * dot(s, n);. 總共 5 次. if(u < 0 || u > 1) return EPS;. <,||,>,總共 3 次. vec3 q = cross(s,e1);. 總共 9 次. float v = f * dot(rayDir, q);. dot,*,總共 6 次. if(v < 0 || (u+v) > 1). return EPS;. <,||,+,>,總共 4 次. // Compute t float t = f * dot(e2, q);. dot,*,總共 6 次. if(t > 0.000001) return t;. >,總共 1 次. 39.

(46) else return EPS; 總共 91 次. }//end triangleIntersection. 附錄 B: Phong 效果程式碼 程式碼. 浮點數運算次數. vec3 lightDir = vec3(lightPos - vertex);. 3 維*1 次減法,總共 3 次. vec3 halfVector=. 正規化 1 次+3 維*(+,-)+”/”,. normalize((eyePos+lightPos)/2-vertex);. 總共 16 次. vec3 N = normalize(Normal);. 正規化 *1,總共 9 次. vec3 L = normalize(lightDir);/. 正規化 *1,總共 9 次. float nl=dot(N, L);. 內積*1,總共 5 次. float nhv = max(dot(N, normalize(halfVector)), 0.0); Max(1), normal(9),dot(5),總 共 15 次 >,總共 1 次. if (nl> 0.0) { outcolor +=0.5* pow(nhv, 70.0)* SpecularColor;. (pow,*)+4 維(*,+),總共 10 次 (*)+4 維(*,+),總共 9 次. outcolor +=0.5 * nl* vec4(Color,1.0);. 總共 77 次. }. 40.

(47)

參考文獻

相關文件

檢查圖形上的每一點在對稱軸之兩側等距離位置是否都有對稱點,若 有,則此圖形是線對稱圖形。. ( 若圖形可以拿起來對折,可以沿著對稱軸對折,檢查圖形是否會完全

‡圖形使用者介面( graphical user interface GUI). ‡圖形使用者介面( graphical user

建議多協助學生進 行運用工具實作的 機會,亦可嘗試將 部分概念以圖像化 (如流程圖、太陽 圖等)的形式呈現

如圖,已知平面上不共線 A、B、D 三點,小明利用尺規作 圖找出另一點 C,使得四邊形 ABCD

如圖,已知平面上不共線 A、B、D 三點,小明利用尺規作 圖找出另一點 C,使得四邊形 ABCD

首先考慮針對 14m 長之單樁的檢測反應。如圖 3.14 所示為其速 度反應歷時曲線。將其訊號以快速傅立葉轉換送至頻率域再將如圖

我們分別以兩種不同作法來進行模擬,再將模擬結果分別以圖 3.11 與圖 3.12 來 表示,其中,圖 3.11 之模擬結果是按照 IEEE 802.11a 中正交分頻多工符碼(OFDM symbol)的安排,以

針對 WPAN 802.15.3 系統之適應性柵狀碼調變/解調,我們以此 DSP/FPGA 硬體實現與模擬測試平台進行效能模擬、以及硬體電路設計、實現與測試,其測 試平台如圖 5.1、圖