• 沒有找到結果。

使用預先計算材質之GLSL光線追蹤優化

N/A
N/A
Protected

Academic year: 2021

Share "使用預先計算材質之GLSL光線追蹤優化"

Copied!
49
0
0

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

全文

(1)國立臺灣師範大學 資訊工程研究所碩士論文. 使用預先計算材質之 GLSL 光線追蹤優化 Optimization of GLSL Shader-Based Ray Tracing with Precomputed Textures. 研究生: 指導教授: 中華民國. 陳冠惟 張鈞法. 撰 博士. 103 年 7 月.

(2) 國立臺灣師範大學資訊工程研究所 碩士學位論文 使用預先計算材質之 GLSL 光線追蹤優化 Optimization of GLSL Shader-Based Ray Tracing with Precomputed Textures. 經考試合格特此證明 審查教授:. 指導教授: 研究所所長:. 中華民國. 103 年 7 月.

(3) 摘要 隨著 GPU 計算能力越來越強大,GPGPU 的使用越來越成熟且廣泛,而除了 CUDA 和 OpenCL 之外 ,GLSL 也是一種 GPGPU 的使用,光線追蹤演算法很適 合實作在 GLSL 上做平行化,因為就 GLSL 來說,fragment shader 是對每個像素 做運算,所以可以藉由實作在 GLSL 來達到平行化的效果。因此,除了演算法本 身的優化,搭配使用 GLSL 來對光線追蹤做平行化,整體效能會有所提升,逐漸 改善光線追蹤耗時的問題。 在這篇論文中,我使用 GPGPU 的幫助,將光線追蹤實做在 GLSL 上以此達 到平行化的效果。在過程中,就 GLSL 光線追蹤方面探討不同的資料處理方法, 進而從中使用較適合且效能較好的方式來處理,並且對光線追蹤的演算法進行優 化,提升整體的效能。最後,在同個場景和效果之下,我分析了 GLSL 光線追蹤 與 GLSL 傳統光柵化之間效能的比較,整理出目前光線追蹤的效能較差的問題點, 並且利用實驗的結果歸納出光線追蹤在使用 GPGPU 的發展趨勢,未來在 GPU 的發展下,光線追蹤和傳統光柵化的效能差距是有拉近的可能。. 關鍵字 光線追蹤、傳統光柵化、效能、GPGPU、GLSL.

(4) Abstract With the growth of GPU computing capabilities, GPGPU becomes more and more mature and far-ranging. In addition to CUDA and OpenCL, GLSL is a kind of GPGPU. Ray Tracing algorithm is suitable for implementing on GLSL. For GLSL, the fragment shader does computation in every pixel, so it can reach the goal of parallelization by implementing on GLSL. Therefore, in addition to the normalization of algorithm, using GLSL to parallelize Ray Tracing can enhance the performance. In this paper, I use GPGPU, implementing Ray Tracing on GLSL to achieve the effect of parallelization. In the process, I discuss different methods of data processing in GLSL Ray Tracing and select the most suitable and most efficient method to use. Then, I extend the Ray Tracing algorithm to enhance the overall performance. Finally, I analyze the performance between GLSL Ray Tracing and GLSL Traditional Rasterization with the same scene and effect, sorting out the problem about the poor performance of Ray Tracing. According to the results of experiment, I summarize the trends of Ray Tracing in the use of GPGPU. With the improvement of GPU, it is possible to narrow the performance gap between GLSL Ray Tracing and GLSL Traditional Rasterization.. Key Words Ray Tracing, Traditional Rasterization, performance, GPGPU, GLSL..

(5) 目錄 第一章 簡介............................................................................................................ 1 第一節 研究背景.................................................................................................. 1 第二節 研究目的.................................................................................................. 2 第三節 論文架構.................................................................................................. 2 第二章 相關研究探討................................................................................................ 4 第一節 光線追蹤.................................................................................................. 4 第二節 傳統光柵化.............................................................................................. 6 第三節 Phong Lighting......................................................................................... 8 第四節 陰影.......................................................................................................... 9 第五節 相關論文................................................................................................ 10 第三章 研究方法與步驟.......................................................................................... 11 第一節 在 shader 上實作光線追蹤 ................................................................... 11 第二節 傳統光柵化之相關設定........................................................................ 12 第三節 讀入場景之資料傳輸............................................................................ 13 第四節 Texture memory 之使用 ........................................................................ 14 第五節 光線追蹤演算法之優化........................................................................ 15 第四章 實驗分析與結果.......................................................................................... 16 第一節 定義球之比較........................................................................................ 17 第二節 uniform 與 texture 方式之比較............................................................. 18 第三節 texture 與 bounding box 之比較 ........................................................... 19 第四節 bounding box 與傳統光柵化之比較 .................................................... 28 第五節 不同像素大小之比較............................................................................ 36 第五章 結論.............................................................................................................. 37 參考著作...................................................................................................................... 39 其他參考...................................................................................................................... 40 附錄.............................................................................................................................. 42.

(6) 附表目錄 表 4.2.1: uniform 與 texture 之效能比較 ................................................................... 19 表 4.3.1: 有無 bounding box 之 FPS 比較................................................................. 22 表 4.3.2: 有無 bounding box 之執行時間比較 ......................................................... 23 表 4.3.3: 有無 bounding box 之 FPS 比較................................................................. 26 表 4.3.4: 有無 bounding box 之執行時間比較 ......................................................... 27 表 4.4.1: 光線追蹤與傳統光柵化之 FPS 比較 ......................................................... 32 表 4.4.2: 光線追蹤與傳統光柵化之執行時間比較 ................................................. 33 表 4.4.3: 表 4.4.4: 表 4.5.1: 表 4.5.2:. 光線追蹤與傳統光柵化之 FPS 比較 ......................................................... 34 光線追蹤與傳統光柵化之執行時間比較 ................................................. 35 不同像素大小下之 FPS 比較 ..................................................................... 36 不同像素大小下之執行時間比較 ............................................................. 36.

(7) 附圖目錄 圖 2.1.1: 光線追蹤概念圖 ........................................................................................... 4 圖 2.1.2: 光線追蹤管線圖 ........................................................................................... 5 圖 2.2.1: 傳統光柵化管線圖 ....................................................................................... 6 圖 2.2.2-a: Vertex Shader 管線圖 .................................................................................. 7 圖 2.2.2-b: Fragment Shader 管線圖 ............................................................................. 7 圖 2.3.1: Phong Lighting 示意圖 .................................................................................. 8 圖 2.3.2: Phong Lighting 光線相關圖 .......................................................................... 9 圖 3.1.1: GLSL 光線追蹤流程圖 ............................................................................... 12 圖 3.4.1: 資料結構示意圖 ......................................................................................... 15 圖 3.5.1: bounding box 示意圖 ................................................................................... 16 圖 4.1.1: 定義球場景之比較 ..................................................................................... 18 圖 4.2.1: 圖 4.3.1: 圖 4.3.2: 圖 4.3.3: 圖 4.3.4:. 測試場景 ..................................................................................................... 19 畫面結果(一) ............................................................................................... 20 畫面結果(二) ............................................................................................... 20 畫面結果(三) ............................................................................................... 20 畫面結果(四) ............................................................................................... 21. 圖 4.3.5: 畫面結果(五) ............................................................................................... 21 圖 4.3.6: 有無 bounding box 之 FPS 比較折線圖..................................................... 22 圖 4.3.7: 有無 bounding box 之執行時間比較折線圖 ............................................. 23 圖 4.3.8: 去掉地板之畫面結果(一) ........................................................................... 24 圖 4.3.9: 去掉地板之畫面結果(二) ........................................................................... 24 圖 4.3.10: 去掉地板之畫面結果(三) ......................................................................... 25 圖 4.3.11: 去掉地板之畫面結果(四) ......................................................................... 25 圖 4.3.12: 去掉地板之畫面結果(五) ......................................................................... 25 圖 4.3.13: 有無 bounding box 之 FPS 比較折線圖................................................... 26 圖 4.3.14: 有無 bounding box 之執行時間比較折線圖 ........................................... 27 圖 4.4.1: 兩者畫面比較 ............................................................................................. 31 圖 4.4.2: 光線追蹤與傳統光柵化之 FPS 比較折線圖 ............................................. 32 圖 4.4.3: 光線追蹤與傳統光柵化之執行時間比較折線圖 ..................................... 33 圖 4.4.4: 光線追蹤與傳統光柵化之 FPS 比較折線圖 ............................................. 34 圖 4.4.5: 光線追蹤與傳統光柵化之執行時間比較折線圖 ..................................... 35.

(8) 第一章. 簡介. 第一節 研究背景 隨著動畫和遊戲對於擬真度的要求越來越高,傳統的光柵化雖然可以很快速 的繪製出畫面,但是其效果十分有限,越來越無法滿足使用者的需求,因此未來 趨勢將可能從傳統的光柵化轉向光線追蹤方式,因為他可以繪製更多不同的效果, 畫面品質也相對較高,但是光線追蹤很大的弱勢在於整個繪製的過程會花較久的 時間,因為他是逐個對像素做填色的動作,而現今的螢幕發展越來越進步,像素 隨之也增加非常多,所以對於光線追蹤會比較弱勢,對於許多很注重即時的遊戲 開發來說更是很大的問題。然而,隨著 GPU 的發展,其運算功能日漸強大,光 線追蹤除了使用好的演算法來加速外,也可以利用 GPU 強大的運算能力,使整 體繪製過程達到平行化的目的,加速光線追蹤的方法並使其可以達到即時的效 果。 在使用 GPU 的幫忙下有三種研究的方向,OpenCL、CUDA 以及 GLSL。 OpenCL (Open Computing Language)是由 Apple 公司發明的開放式計算語言,就 計算機圖學方面他可以編譯 AMD、Intel 及 NVidia 等廠牌的 GPU;CUDA (Compute Unified Device Architecture)是 NVidia 發明出來可使 GPU 可以作為 C 編 譯器的開發環境;GLSL (OpenGL Shader Language)是最早可以編譯 GPU 的程式 語言,其主要用來對傳統光柵化做各式各樣進階的效果呈現。 對這三種使用 GPU 的程式語言來說,GLSL 是最早發明出來的,但是在上. 1.

(9) 面做光線追蹤的例子卻很少,因為做在 GPU 上直覺就是以專門衍生出來的 OpenCL 和 CUDA 為主,很少有人會在用來做進階效果的 shader 上實作光線追 蹤,而且當要使用 GPU 來做平行加速時,CUDA 和 OpenCL 開始陸續登場,因 此更沒有人會想要在 shader 上做光線追蹤。. 第二節 研究目的 雖然光線追蹤可以產生很高品質的畫面及各種精細的效果,但是現今的遊戲 和動畫還是因為注重即時及成本而鮮少使用他。因此,此篇研究的方向主要是在 GLSL 上實作光線追蹤,其中說明了整個研究過程中的光線追蹤程式的演進,其 中遇到的困難以及各種方法的優缺點,並且最後在特定的效果下與傳統光柵化做 比較,歸納出光線追蹤與傳統光柵化在同樣使用 GLSL 的環境以及相同 GPU 下, 其效能的起伏趨勢是如何,進而說明未來在使用 GPU 的幫助下,光線追蹤是可 以即時的繪製出更高品質的畫面,且效能不會太差。. 第三節 論文架構. 本篇論文總共分成六個章節:第一章為簡介,如前幾節所言主要講述目前光 線追蹤在現今業界的優劣處以及本篇主要研究的目的;第二章主要介紹本研究會 使用到的一些基本概念,像是光線追蹤、傳統光柵化和實作的效果等等,以及與 幾篇參考論文之比較;第三章為實作光線追蹤在 shader 上的方法,包含其使用 到的資料傳遞方法的改進以及其演算法的優化,以及傳統光柵化的相關設定;第 四章主要為實驗的結果與分析,包含光線追蹤演進方法之間的效能比較,最後是 2.

(10) 我使用最後版本的 GLSL 光線追蹤與 GLSL 傳統光柵化去做效能的比較與分析, 歸納出其成長的趨勢;第五章為整篇論文的總結,將上述所有章節所得到的結果 整理出與目的相互呼應的結論;第六章為本篇論文所參考到的論文著作以及一些 相關網頁。. 3.

(11) 第二章 相關研究探討 在實作這個研究之前,有許多計算機圖學方面的觀念會運用到,包括最基本 的光柵化方式及光線追蹤方式,還有一些特定的效果,包括 Phong 光線照明法、 陰影和反射等等。根據這些繪製畫面的方法及特殊效果,基本上就完成了研究的 設定,以下就先來說明這些基本元素。. 第一節 光線追蹤 光線追蹤(Ray tracing)如圖 2.1.1 所示,是跟蹤從眼睛發出的光線而不是 光源發出的光線,透過這樣一項技術生成編排好的場景的數學模型顯現出來。這 樣得到的結果類似於光線投射與掃描線渲染方法的結果,但是這種方法有更好的 光學效果,例如對於反射與折射有更準確的模擬效果,並且效率非常高,所以當 追求這樣高品質結果時候經常使用這種方法。. 圖 2.1.1: 光線追蹤概念圖 "Ray trace diagram" by Henrik - Own work. Licensed under Creative Commons. 4.

(12) 在物理學中,光線追跡可以用來計算光線在介質中傳播的情況。在介質中傳播時, 光線可能會被介質吸收,改變傳播方向或者射出介質表面等。我們透過一些物理 的公式計算來算出透過介質中的情形以繪製出這種特殊的情況。 光線追蹤的管線圖如圖 2.1.2 所示,其演算法是從眼睛(相機)對螢幕上每個 像素打一條或數條光線,接著每條光線會對對應的幾何圖形單位,像是三角片, 做遍歷(traverse),然後利用交點判斷式(intersection)來判斷該光線是否有打到物 件,沒有打到物件則回饋背景的顏色,有打到物件則再繼續以該點發射光線連到 光源,如果途中有在打到其他物件則回饋出陰影的顏色或是折射反射的效果,否 則就根據與該光源的距離來算出該回饋顏色的比例值。. 圖 2.1.2: 光線追蹤管線圖. 5.

(13) 第二節 傳統光柵化 傳統光柵化(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 的管線流程圖, 6.

(14) 在 Host 端以 OpenGL 設定好場景物件、顏色及眼睛(相機)的位置之後,透過矩陣 轉換後將頂點資訊傳入 vertex shader 之中,定義好這些點的位置之後,將其資訊 傳入下個階段的 fragment shader 中,以這些頂點所在的範圍內進行直接著色或是 使用貼圖資訊來著色。. 圖 2.2.2-a: Vertex Shader 管線圖. 圖 2.2.2-b: Fragment Shader 管線圖. 7.

(15) 第三節 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 Ia + kd Id l ·n + ks Is (v ·r )a 其中 l 為入射光、n 為法向量、v 為射向眼睛的光線、r 為反射光。. 8.

(16) 圖 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 的方式稍快一些,因為 9.

(17) 他只需要去查詢 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。. 10.

(18) 第三章. 研究方法與步驟. 介紹完關於本次研究所需要用到的概念,接著要進入如何實作此研究的方法, 主要以光線追蹤為核心然後實作在 shader 上。第一節主要介紹如何將光線追蹤 實作在 shader,關於其相關設定以及最基本的定義球的場景;第二節主要介紹傳 統光柵化的相關設定,將場景、顏色和效果設定與光線追蹤一致以來做之後效能 比較的部分;第三節探討讀入 obj 格式的模型,利用 GLSL 上最基本且直觀的傳 遞資料方法 uniform 將場景資料傳到 shader 上;第四節主要使用 texture memory 上資料傳遞的方法,改進 uniform 上的一些限制;第五節針對光線追蹤的演算法 加入 bounding box 的測試去減少不必要的像素計算,提升效能。. 第一節 在 shader 上實作光線追蹤 關於 shader 和光線追蹤的基本概念如第二章所介紹的,接著要將兩者做結 合,其流程圖如圖 3.1.1 所示,方式是在 Host 端用一般建模的方法做出一個跟視 窗等大的平面,接著對此平面作 shader 的設定。首先,將每個像素的位置先傳 入 vertex shader 去做設定,接著將設定好的像素位置資訊傳入 fragment shader 中, 如此就可以從定義的眼睛位置去對每個像素去打光線,然後執行遍歷、找交點以 及最後的渲染步驟,對每個像素去做填色。 整個光線追蹤的演算法主要都是在 fragment shader 中完成,最初步的定義球 場景也是在裡面直接宣告完成,這算是光線追蹤的一項優勢,給定球心的座標及 半徑後就可以畫出球的模型,其幾何圖形的片數僅計算為一片,相較於傳統光柵 化的內建球方式,省下不少處理場景幾何圖形的時間,有了球的模型我們就可以 11.

(19) 在上面做打光、反射或折射等等的效果,而這邊我用的是 Phong Lighting 的打光 效果,搭配陰影去呈現整個畫面。. 圖 3.1.1: GLSL 光線追蹤流程圖. 第二節 傳統光柵化之相關設定 在前面第二章第二節有介紹傳統光柵化的基本概念,他是計算機圖學領域中 最基本的繪圖方式之一,而我使用的傳統光柵化程式主要是為了與 GLSL 光線追 蹤去做效能的比較,其撰寫的版本只有一個,而為了達到比較公平的測試條件, 其場景的設定與光線追蹤的調整成幾乎一模一樣,包含眼睛(相機)的座標位置、 場景中模型的座標位置、光線的座標位置以及模型的顏色等等,但畢竟是兩種不 同的渲染方式,兩者畫面上有一些細小的差異,但我認為對整體效能的比較影響 不大。 12.

(20) 第三節 讀入場景之資料傳輸 由於光線追蹤的場景如果只有定義球會顯得過於單調,為了增加場景的複雜 度,讀入 obj 是必須要做的事情,但是讀入檔案只能在 Host 端實作,所以如何 把資料傳入 shader 中是一大重點。GLSL 資料傳輸的種類有三種:uniform、attribute 和 varying,uniform 是用於 Host 端與 fragment shader 之間的資料傳遞,attribute 則是 Host 端與 vertex shader 之間的資料傳遞,而 varying 是 vertex shader 與 fragment shader 之間的資料傳遞,由於光線追蹤是實作在 fragment shader 上,所 以資料傳遞自然就用 uniform 的方式,將 obj 檔案中的點座標及面的資訊傳進 shader 中再去作組合,最後就直接用三角片的交點判斷、Phong lighting,渲染出 欲呈現的場景畫面。 雖然最直覺的資料傳遞方法就是 uniform,但是他存在記憶體大小限制的問 題,uniform 其實可以想像為快取記憶體(cache memory),通常在使用的時候是傳 遞一些參數,像是動作參數或是數學運算的參數,不太會用來傳遞數量較多的值, 因此他可暫存的大小並不多,例如我程式中傳遞一個方塊的模型需要用到大小為 36 的陣列、cornel box 需要大小為 96 的陣列,這些都還存的進 uniform 的記憶體 中,但是如果要存入一個簡單的球模型,其需要 360 的陣列大小,此時程式就會 出現陣列過大的錯誤。這方面可以利用 texture memory 來解決,這將會在下一節 做詳細的介紹。. 13.

(21) 第四節 Texture memory 之使用 除了本章第三節所提及的 uniform 方法,還有一個方法可以傳遞資料到 fragment shader,那就是使用 texture memory。Texture memory 是一塊專門用來做 繪圖相關的記憶體,例如以 OpenGL 來說,他可以將讀入的材質貼圖以 RGB 的 形式存在該記憶體中,然後 fragment shader 中就可以利用像是 texture()或 texelFetch()等等的指令去把他讀取進來做處理。一般來說,texture memory 是用 來使用像是模型做貼圖,或是對整個場景背景做貼圖,但是針對光線追蹤,我把 texture memory 拿來當作一般的記憶體空間,將資料以陣列的方式傳入 shader 中 而非以材質的模式,而如何把資料存入並且做連結,這邊會使用一種資料結構來 處理。 在 fragment shader 中抓取 texture 的資料結構如圖 3.4.1 所示,根據 obj 檔案 內的格式,一個面有三個點的編號資訊,一個點有 x、y、z 三個點的座標,圖中 的三角片清單材質(Triangle List Texture)是將面裡所有資訊存成一個材質,三角片 點材質(Triangle Vertex Texture)是將所有點的座標資訊存成一個材質,在 fragment shader 中首先先使用 texelFetch()抓取面中的三角片編號資訊,因為剛好是三個參 數,所以我們可以把 RGB 三個通道都打開做使用,分別存這三個三角片的編號, 接著將這些編號分別當作參數再使用一次 texelFetch()去抓取該三角片的三個頂 點座標,如此就可以得到我們所需的三角片,進行光線追蹤的後續步驟。雖然 texture memory 也有限制,但是可以跑到一定數量的三角片,就我測試的資料可 以跑到 8000 片三角片,比 uniform 的多了好幾倍。此外,我所使用的材質類型 為一維,也就是一個寬為 1 的一維陣列,雖然最大可以使用二維材質,但是使用 14.

(22) 二維材質會使整個效能降低,所以為了維持效能而選擇使用較小的二維材質。. 圖 3.4.1: 資料結構示意圖. 第五節 光線追蹤演算法之優化 光線追蹤實作在 shader 上是一種間接使用 GPU 的幫助來加速的方法,屬於 硬體層面,其影響效能的部分佔比較大的比例,但是從軟體的角度來切入,也有 許多演算法可以使效能提升,最有名的加速結構包括 kd-tree、BVH 和 grid 的方 式,但是實作在 shader 上面各有利弊,例如 kd-tree 必須傳入大量的樹節點資訊 及邊界資訊,這對 texture memory 也是種負擔,而且當程式為互動式的時候效能 就沒有想像中好,因此,我使用的是最基本的 bounding box 的測試來優化。 由於光線追蹤是對每個像素逐一做填色的動作,所以當畫面像素一多的時候, 打的光線數也越多,效能會越差,然而真的有必要每個像素都去做處理呢?其實 不然,我們只需要對有場景覆蓋的像素做處理就好,因此這裡使用 bounding box 的方式,如圖 3.5.1 所示,先找出整個場景的最大值座標和最小值座標,根據這 個座標我們可以把場景像是關在一個盒子裡面,判斷當我的光線有打在這個盒子 15.

(23) 裡面的時候才做後續的步驟,否則不做任何事或是直接畫出背景的顏色,這個方 法可以省略不必要的像素,減少交點判斷和陰影判斷等比較花時間的指令,略為 提升整體的效能,不過其缺點是當場景為封閉式或是幾乎填滿整個畫面,比如說 很多人都有使用過的 cornel box 場景,bounding box 測試效果就會比較差,因為 幾乎所有像素都要做處理。. 圖 3.5.1: bounding box 示意圖,在邊界外的像素就填成紅色,整個場景像是被關 在一個盒子裡面,減少不必要的像素處理。. 第四章. 實驗分析與結果. 根據第三章的方法,本章節進行了一系列的效能及畫面比較,其效果為 16.

(24) Phong Lighting 和陰影,測試環境為 Visual Studio 2010、Nvidia GT650 ti,畫面大 小為 512×512。此外,程式皆可讓使用者做操作,利用滑鼠來調整眼睛與光線的 位置。第一節首先先測試最基本的定義球場景,比較光線追蹤與傳統光柵化的兩 種渲染方式的畫面以及效能;第二節主要以光線追蹤為主軸,比較 uniform 和 texture 這兩種傳遞資料的方式並討論其優缺點;第三節將光線追蹤演算法加入 bounding box 的方法,比較 bounding box 的使用有無所造成的效能差異;第四節 主要比較比較快的 bounding box 的版本與傳統光柵化去做效能及畫面的比較;最 後第五節主要比較在不同像素大小下,比較及分析光線追蹤的效能方面的起伏趨 勢。. 第一節 定義球之比較 定義球的場景設定為三顆大小一樣的球,其顏色分別為紅、綠、藍,眼睛與 光源的位置在光線追蹤與傳統光柵化兩者設定一致,其畫面結果如圖 4.1.1 所示。 場景位置與效果呈現方面由圖可以看出幾乎是一模一樣的畫面,而效能方面由於 是複雜度不高的場景,兩者的 FPS 皆為 1000,執行時間為 1ms。由此可知光線 追蹤在使用他的定義球場景的優勢,其效能可以達到與傳統光柵化幾乎一模一樣 的速度。. 17.

(25) 圖 4.1.1: 定義球場景之比較,左圖為光線追蹤,右圖為傳統光柵化. 第二節 uniform 與 texture 方式之比較 uniform 和 texture 都是傳遞資料至 shader 中的方法,雖然 uniform 方式比較 直觀,但是他比較類似於快取記憶體,因此記憶體的大小有限,根據測試的 obj 模型,如果模型的三角片資訊太多,uniform 方式會有陣列過大無法存取的錯誤, 所以測試的模型不能太過複雜,場景使用的是 12 片三角片的 cube 和 36 片的 cornell box,再繼續測試 120 片三角片的 simple sphere 場景,其陣列就會因為限 制而無法存取所有資訊,畫面結果如圖 4.2.1 所示。效能方面如表 4.2.1,由於是 複雜度不高的場景,兩者的效能差不多,cube 場景的執行時間約都為 1ms 而 cornell box 場景的執行時間大約都為 3ms,真正有明顯差異要增加到更多三角片 的場景。. 18.

(26) 圖 4.2.1: 測試場景,左圖為 cube,右圖為 cornell box Uniform texture 1000 1000 cube 之 FPS 250-333 333-500 cornell 之 FPS 1 1 cube 之執行時間(ms) 3-4 2-3 cornell 之執行時間(ms) 表 4.2.1: uniform 與 texture 之效能比較. 第三節 texture 與 bounding box 之比較 這節主要討論複雜度由低到高的起伏趨勢,一邊有用 bounding box 作演算法 的優化,另外一邊則沒有,兩者的資料傳遞都是使用 texture,如此才可以讀入三 角片數量比較多的模型。實驗結果畫面如圖 4.3.1 到圖 4.3.6 所示,分成有加入地 板跟沒有加入地板這兩種場景去做分析,其分析效能之結果如表 4.3.1 和表 4.3.2、 圖 4.3.6 和圖 4.3.7 所示。. 19.

(27) 圖 4.3.1: 畫面結果(一),左圖為 cube,右圖為 sphere. 圖 4.3.2: 畫面結果(二),左圖為 dolphin,右圖為 Lego man. 圖 4.3.3: 畫面結果(三),左圖為 Pokemon Trainer,右圖為 Pikachu 20.

(28) 圖 4.3.4: 畫面結果(四),左圖為 cat,右圖為 bunny. 圖 4.3.5: 畫面結果(五),左圖為 cow,右圖為 bunny2. 21.

(29) 三角片數量. 有 bounding box. 無 bounding box. cube. 14. 1000. 1000. sphere. 122. 200. 200. dolphin. 566. 50. 41.7. Lego man. 1012. 23.3. 22.7. Pokemon Trainer. 2135. 10.6. 10.4. Pikachu. 3198. 6.62. 6.41. cat. 3956. 5.85. 4.83. bunny. 4970. 3.73. 3.65. cow. 5806. 3.95. 3.14. bunny2. (FPS). 7682 2.95 2.42 表 4.3.1: 有無 bounding box 之 FPS 比較(單位:fps) 1200 1000 800 600 400 200 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). 有bounding box 無bounding box. 圖 4.3.6: 有無 bounding box 之 FPS 比較折線圖. 22.

(30) 三角片數量. 有 bounding box. 無 bounding box. cube. 14. 1. 1. sphere. 122. 5. 5. dolphin. 566. 20. 24. Lego man. 1012. 43. 44. Pokemon Trainer. 2135. 94. 96. Pikachu. 3198. 151. 156. cat. 3956. 171. 207. bunny. 4970. 268. 274. cow. 5806. 253. 318. bunny2. (ms). 7682 339 413 表 4.3.2: 有無 bounding box 之執行時間比較(單位:ms). 450 400 350 300 250 200 150 100 50 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). 有bounding box 無bounding box. 圖 4.3.7: 有無 bounding box 之執行時間比較折線圖 由上述的圖表可以看出有使用 bounding box 會比沒有使用的 FPS 提升大概 1 個單位,執行時間也有減少,而在 bunny 和 cow 這邊的曲線,在未使用 bounding box 時,曲線是如預期一樣 cow 的三角片數量比較多所以執行時間比較久,但 如果使用時,cow 的效能就會反而比 bunny 好,原因是因為 bunny 的邊界比 cow 的大,所以 cow 所省下的像素計算比 bunny 多,效能提升的幅度比較大。 23.

(31) 接著實驗額外測試了沒有平面的版本,如圖 4.3.8 到圖 4.3.12 所示,主要是 減少了影子的渲染,其實驗目的主要是可以由表 4.3.3 和表 4.3.4、圖 4.3.13 和圖 4.3.14 看出,除了整體的效能如預期般有所提高,沒有加入平面的版本在 bounding box 使用下效能提升的倍率比較高,甚至有的模型可以達兩倍,其主要原因是因 為去掉了平面的邊界,完全由模型自己的邊界來決定,所以太細小的模型所省去 的像素計算就會比較多,效能提升的幅度相對也比較大。. 圖 4.3.8: 去掉地板之畫面結果(一),左圖為 cube,右圖為 sphere. 圖 4.3.9: 去掉地板之畫面結果(二),左圖為 dolphin,右圖為 Lego man. 24.

(32) 圖 4.3.10: 去掉地板之畫面結果(三),左圖為 Pokemon Trainer,右圖為 Pikachu. 圖 4.3.11: 去掉地板之畫面結果(四),左圖為 cat,右圖為 bunny. 圖 4.3.12: 去掉地板之畫面結果(五),左圖為 cow,右圖為 bunny2. 25.

(33) 三角片數量. 有 bounding box. 無 bounding box. cube. 14. 1000. 1000. sphere. 122. 250. 200. dolphin. 566. 125. 52.6. Lego man. 1012. 52.6. 27.8. Pokemon Trainer. 2135. 22.2. 12.7. Pikachu. 3198. 7.94. 7.25. cat. 3956. 12. 5.99. bunny. 4970. 4.95. 3.95. cow. 5806. 8.4. 3.94. bunny2. (FPS). 7682 5.62 2.92 表 4.3.3: 有無 bounding box 之 FPS 比較(單位:fps) 1200 1000 800 600 400 200 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). 有bounding box 無bounding box. 圖 4.3.13: 有無 bounding box 之 FPS 比較折線圖. 26.

(34) 三角片數量. 有 bounding box. 無 bounding box. cube. 14. 1. 1. sphere. 122. 4. 5. dolphin. 566. 8. 19. Lego man. 1012. 19. 36. Pokemon Trainer. 2135. 45. 79. Pikachu. 3198. 126. 138. cat. 3956. 83. 167. bunny. 4970. 202. 251. cow. 5806. 119. 254. bunny2. (ms). 7682 178 343 表 4.3.4: 有無 bounding box 之執行時間比較(單位:ms). 400 350 300 250 200 150 100 50 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). 有bounding box 無bounding box. 圖 4.3.14: 有無 bounding box 之執行時間比較折線圖. 27.

(35) 第四節 bounding box 與傳統光柵化之比較 這節主要比較有使用 bounding box 的光線追蹤以及傳統光柵化兩者之間的 效能,其畫面與效果設定為一致,畫面如圖 4.4.1 所示,兩者的畫面幾乎一模一 樣。. 28.

(36) 29.

(37) 30.

(38) 圖 4.4.1: 兩者畫面比較,左邊為光線追蹤,右邊為傳統光柵化 效能方面,如表 4.4.1 和表 4.4.2、圖 4.4.2 和圖 4.4.3 所示,由圖表可以看出 傳統光柵化的在三角片數量比較多的時候,效能會是光線追蹤的好幾十倍,原因 是因為傳統光柵化是以物件為核心,他只需要去判斷物件的位置及其深度值就可 以渲染出結果,不像光線追蹤要對每個像素去做運算,所以才有如此大的差距。 另一個原因就是傳統光柵化沒有觸碰到他的瓶頸,也就是 fill rate 的問題,當三 角片把畫面填滿的程度越高,光柵化對每個三角片所需要的指令數就會增加,渲 染時間就會下降。. 31.

(39) 三角片數量. GLSL 光線追蹤. GLSL 傳統光柵化. cube. 14. 1000. 1000. sphere. 122. 200. 1000. dolphin. 566. 50. 1000. Lego man. 1012. 23.3. 1000. Pokemon Trainer. 2135. 10.6. 500. Pikachu. 3198. 6.62. 500. cat. 3956. 5.85. 333. bunny. 4970. 3.73. 333. cow. 5806. 3.95. 250. bunny2. (FPS). 7682 2.95 200 表 4.4.1: 光線追蹤與傳統光柵化之 FPS 比較(單位:fps) 1200 1000 800 600 400 200 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). GLSL 光線追蹤 GLSL 傳統光柵化. 圖 4.4.2: 光線追蹤與傳統光柵化之 FPS 比較折線圖. 32.

(40) 三角片數量. GLSL 光線追蹤. GLSL 傳統光柵化. cube. 14. 1. 1. sphere. 122. 5. 1. dolphin. 566. 20. 1. Lego man. 1012. 43. 1. Pokemon Trainer. 2135. 94. 2. Pikachu. 3198. 151. 2. cat. 3956. 171. 3. bunny. 4970. 268. 3. cow. 5806. 253. 4. bunny2. (ms). 7682 339 5 表 4.4.2: 光線追蹤與傳統光柵化之執行時間比較(單位:ms). 400 350 300 250 200 150 100 50 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). GLSL 光線追蹤 GLSL 傳統光柵化. 圖 4.4.3: 光線追蹤與傳統光柵化之執行時間比較折線圖. 33.

(41) 跟上一節一樣,額外測試了沒有地板的版本,如表 4.4.3 和表 4.4.4、圖 4.4.4 和圖 4.4.5 所示,由圖表可以得知在傳統光柵化的效能沒有甚麼改變,因為只是 去掉了兩個三角片的渲染,而光線追蹤方面就最多可以成長兩倍,縮短與傳統光 柵化的差距,這除了表示演算法的優化有很大的關係之外,少了 shadow ray 的發 射也省去了一些時間,如果使用 hybrid 的方式將影子用 texture 的方式套用在光 線追蹤上,有加入地板的效能結果應該會跟目前無地板的數據相似。 三角片數量. GLSL 光線追蹤. GLSL 傳統光柵化. cube. 14. 1000. 1000. sphere. 122. 250. 1000. dolphin. 566. 125. 1000. Lego man. 1012. 52.6. 1000. Pokemon Trainer. 2135. 22.2. 500. Pikachu. 3198. 7.94. 500. cat. 3956. 12. 333. bunny. 4970. 4.95. 333. cow. 5806. 8.4. 250. bunny2. (FPS). 7682 5.62 200 表 4.4.3: 光線追蹤與傳統光柵化之 FPS 比較(單位:fps) 1200 1000 800 600 400 200 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). GLSL 光線追蹤 GLSL 傳統光柵化. 圖 4.4.4: 光線追蹤與傳統光柵化之 FPS 比較折線圖 34.

(42) 三角片數量. GLSL R 光線追蹤. GLSL 傳統光柵化. cube. 14. 1. 1. sphere. 122. 4. 1. dolphin. 566. 8. 1. Lego man. 1012. 19. 1. Pokemon Trainer. 2135. 45. 2. Pikachu. 3198. 126. 2. cat. 3956. 83. 3. bunny. 4970. 202. 3. cow. 5806. 119. 4. bunny2. (ms). 7682 178 5 表 4.4.4: 光線追蹤與傳統光柵化之執行時間比較(單位:ms). 250. 200. 150. 100. 50. 0 0. 2000. 4000. 6000. 8000. 10000 (三角片片數). GLSL R光線追蹤 GLSL 傳統光柵化. 圖 4.4.5: 光線追蹤與傳統光柵化之執行時間比較折線圖. 35.

(43) 第五節 不同像素大小之比較 這節主要探討 GLSL 光線追蹤與 GLSL 傳統光柵化在不同像素大小之效能比 較,以 sphere.obj (1562 個三角片) 為例,由表 4.5.1 和表 4.5.2 可觀察出,光線追 蹤呈現一個規律的成長,當像素數量變為四倍時,其 FPS 也下降四倍,執行時 間變為四倍,而相對的傳統光柵化幾乎是沒有甚麼變化。由此可以歸納出,如果 要使兩者的效能更加接近的話,一種方法是避開光線追蹤的弱勢,降低畫面的解 析度,也就是減少總像素數量,另一種方法就是增大每個三角片的大小,使其盡 量填滿整個畫面,由 fill rate 的觀點去使傳統光柵化達到瓶頸,前者已目前螢幕 發展的趨勢來說是不太可能,所以只能靠硬體的成長跟加速結構演算法的幫助去 提升效能。 GLSL 光線追蹤 128×128 256×256 512×512 1024×1024. 143 1000 45.5 1000 12.5 1000 3.23 1000 表 4.5.1: 不同像素大小下之 FPS 比較 GLSL 光線追蹤. 128×128 256×256 512×512 1024×1024. GLSL 傳統光柵化. GLSL 傳統光柵化. 7 1 22 1 80 1 310 1 表 4.5.2: 不同像素大小下之執行時間比較. 36.

(44) 第五章. 結論. 現今遊戲和動畫業的蓬勃發展,對於畫面的擬真度和效果越來越好,而光線 追蹤演算法可以渲染出比傳統光柵化更高品質的畫面以及更擬真更複雜的效果, 但是速度往往是他的敗筆,因為光線追蹤演算法需要對每個像素去做處理,尤其 是現在的螢幕發展的也是很迅速,解析度越來越高,所以開發者礙於速度少使用 光線追蹤。 本篇研究實驗將光線追蹤實作在 GLSL 上,將整個環境設定成與傳統光柵化 一致,把通常使用在做進階效果的 shader 上面做光線追蹤演算法,進而直接使 用 GPU 來做平行化加速。除了硬體環境相同之外,場景及效果也設定為一致, 並且分析了兩者之間的效能差異,由第四章的實驗結果可以看出,傳統光柵化仍 比光線追蹤快許多,而且隨著三角片的數量越多差距會越大,但是光線追蹤演算 法進行一些優化並且再測試沒有地板的版本時,原本複雜度比較低的場景可以跑 到幾乎一模一樣的速度,而最大差距的場景可以由原本的 80 倍縮小為 40 倍,去 掉地板等同於是省掉大部分的影子計算,所以由此可推測出如果將陰影的計算也 改用傳統光柵化的方式當成 texture 去讀,就可以達到差不多的效能。此外,此 實驗只有使用基本的 bounding box 判斷來優化演算法,如果使用其他進階的加速 結構,效能會在更加提升。因此,由上述的實驗結果及分析,再加上 GPU 本身 的發展趨勢,光線追蹤在未來遊戲業及動畫業的使用上來說還是具有可行性的, 速度方面的問題可以慢慢被改善。 就未來發展性而言,此研究只使用基本的 Phong Lighting 方式,還有很多進. 37.

(45) 階效果像是間接照明、全局照明等等也可以加入 GLSL 光線追蹤去做效能的分析 與比較。另外就是,可以將 shader 上的優勢用在 GLSL 光線追蹤上,例如 shadow ray 的方式改用 shadow map 的方式去做,如果加入 skybox 等背景可以用內建的 cube map texture 儲存方式去做使用。就演算法的部分可以加入進階的加速結構 像是 kd-tree、BVH、grid 等等來提升整體效能,雖然可能會用掉大量的 texture memory 空間。此外,與以前的同樣研究 GLSL 光線追蹤的論文結果來看,GPU 的影響其實佔滿重要的一塊,差距大的話可以差到幾十倍,所以如果使用更高階 的 GPU 會對平行化光線追蹤更有幫助,縮短兩者的差距。. 38.

(46) 參考著作 [AL09]. Aila T., Laine S.: Understanding the efficiency of ray traversal on GPUs. In Proceedings of High-Performance Graphics 2009 (2009), 145–149.. [C05]. Christen M.: University of Applied Sciences Basel (FHBB)Diploma Thesis. Ray Tracing on GPU. January 19, 2005.. [P04]. Purcell T.J.: RAY TRACING ON A STREAM PROCESSOR. PhD thesis, Stanford University (2004).. [PBM02] Purcell T. J., Buck I., Mark W. R., Hanrahan P.: Ray Tracing on Programmable Graphics Hardware. In ACM SIGGRAPH 2002. [PFL13] Parker S. G., Friedrich H., Luebke D., Morley K., Bigler J., Hoberock J., McAllister D., Robison A., Dietrich A., Humphreys G., McGuire M., Stich M.: GPU Ray Tracing. Communications of the ACM, May 2013. [SPD04] Schmittler J., Pohl D., Dahmen T., Vogelgesang C., Slusallek P.: Realtime Ray Tracing for Current and Future Games, 2004. [W79]. Whitted T.: An improved illumination model for shaded display. Proceedings of the 6th annual conference on Computer graphics and interactive techniques (1979).. [WB01] Wald I., Benthin C., Wagner M., Slusallek P.: Interactive rendering with coherent ray tracing. In Computer Graphics Forum (Proceedings of Eurographics 2001).. 39.

(47) 其他參考 [1] Phong Shading (n.d.) Retrieved April 3th, 2014 from http://en.wikipedia.org/wiki/Phong_shading [2] Ray Tracing (n.d.) Retrieved June 1th, 2014 from http://en.wikipedia.org/wiki/Ray_tracing_%28graphics%29 [3] Shader(n.d.) Retrieved June 4th , 2014 from http://en.wikipedia.org/wiki/Shader [4] Shadow map (n.d) Retrieved June 28th , 2014 from http://en.wikipedia.org/wiki/Shadow_mapping [5] Texture memory (n.d) Retrieved July 6th , 2013 from http://en.wikipedia.org/wiki/Texture_memory [6] GPGPU (n.d.) Retrieved July 8th, 2014 from http://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processin g_units [7] OpenCL (n.d.) Retrieved July 7th, 2014 from http://en.wikipedia.org/wiki/OpenCL [8] CUDA (n.d.) Retrieved July 7th, 2014 from http://en.wikipedia.org/wiki/CUDA [9] OpenGL (n.d.) Retrieved July 8th, 2014 from http://en.wikipedia.org/wiki/OpenGL [10] OpenGL Shading Language (n.d.) Retrieved June 20th, 2014 from http://en.wikipedia.org/wiki/OpenGL_Shading_Language [11] Rasterization (n.d.) Retrieved March 14th, 2014 from http://en.wikipedia.org/wiki/Rasterisation [12] Minimum bounding box (n.d.) Retrieved January 29th, 2014 from http://en.wikipedia.org/wiki/Minimum_bounding_box [13] OpenGL ES 2.0 的三種變量類型: uniform 變量. October 7th 2011 on the World Wide Web: http://blog.csdn.net/jackers679/article/details/6848085. 40.

(48) [14] OpenGL ES 2.0 編程基礎: OpenGL 中的圖形處理固定管線流程. June 10th 2012 on the World Wide Web: http://blog.csdn.net/iispring/article/details/7649628 [15] free models on the World Wide Web: http://tf3dm.com/ [16] free models on the World Wide Web: http://www.turbosquid.com/Search/3D-Models/free/obj [17] free models on the World Wide Web: http://www.3dvia.com/search/?search[current_page]=8&search[results_per_page ]=12&search[sort_order]=Rank&search[format]=obj&search[file_types]=1 [18] Fast, Minimum Storage Ray/Triangle Intersection, Möller & Trumbore. Journal of Graphics Tools, 1997.. 41.

(49) 附錄 A.1 判斷三角片的交點使用所使用的資料結構 float triangleIntersection(Ray r,int triangleno) { //fetch the faces and vertices information from texture Memory. ivec3 faceNo; vec3 a_pos, b_pos, c_pos; faceNo = ivec3(texelFetch(Faces, triangleno, 0)); a_pos = vec3(texelFetch(Vertices, (int(faceNo.x)), 0))*scale; b_pos = vec3(texelFetch(Vertices, (int(faceNo.y)), 0))*scale; c_pos = vec3(texelFetch(Vertices, (int(faceNo.z)), 0))*scale;. vec3 e1 = b_pos - a_pos; vec3 e2 = c_pos - a_pos; vec3 n = cross(r.direction , e2);. float a = dot(e1, n); if(a > -0.00001 && a < 0.00001) return 100000; float f=1/a; vec3 s = r.start - a_pos; float u = f * dot(s, n); if(u < 0 || u > 1) return 100000; vec3 q = cross(s,e1); float v = f * dot(r.direction, q); if(v < 0 || (u+v) > 1) return 100000; // Compute t float t = f * dot(e2, q); if(t > 0.000001) return t; else return 100000; }. 42.

(50)

參考文獻

相關文件

首先,在前言對於為什麼要進行此項研究,動機為何?製程的選擇是基於

利用 Web Survey 來蒐集資料有許多的好處。許多研究者利用 Web Survey 進行研究的主要原因在於可以降低成本、即時的回覆。然而,Web Survey

根據研究背景與動機的說明,本研究主要是探討 Facebook

接下來的 FDTD 疊代運算將是整個計算的核心,也是運算量最大 的部分,在這中間,如何利用光波導的性質以及傳播常數等特徵參量

在與 WINS 有關的研究之中,除了研發感測器硬體這個領域之外,其它的領域均需要

本研究主要以 But-for 崩塌竣工時程分析技術為基礎進行理論推導,確認此延遲分析技術 計算邏輯之問題與完整性,之後提出修正之計算邏輯,使

本研究旨在使用 TI-Nspire CAS 計算機之輔助教學模式,融入基礎 統計學的應用,及研究如何使用 TI-Nspire CAS

本研究於 2017 年 2 月至屏東縣 10 所校園採集使用水源及經淨水處理