第五章 實驗設計與結果討論
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 流程
19
圖 5.2:所要比較的 Shader based Rasterization 流程
5.2.2 畫面比對實驗設計
在第一層的畫面分析比較,我們想分析兩方法每個像素上的實質差異,並且 利用將兩方法的差異度量化,透過不同三角片數的差別,想了解,是否越複雜的 場景(在這裡我們指的是三角片數越多))所得的畫面差異越大。具體的實驗內容,
我們可參照表 5.2 所示,而我們使用的畫面比較場景為單一物體的開放式場景,
而我們所採用的 Phong 效果皆是使用 Per-Fragment 版本的 Phong 效果。
實驗方法 逐步映對像素 RGB 值差異比較
實驗目的
即使從肉眼觀察兩者 Phong 效果的畫面幾乎沒什麼差異,我們還 是想透過實驗證明真的一樣,或者假使有些微差異,那麼差異又 是在哪裡?
實驗步驟
透過兩種方法分別生成畫面截取。
將兩種方法透過 Nsight 工具紀錄所有像素的 RGB 值。
透過程式將兩者圖中所對應的像素 RGB 值分別相減,取絕 對值,並且將 RGB 值相差值,取平均後當成該像素差異值,
而全部像素計算完後,再加總一次,取平均當成這場景的最 後差異比較數值,用來做後續結果討論。
實驗輸出
會有兩者輸出:
第一種輸出是透過圖像直接相減,取絕對值後,畫出來的畫 面差異圖,用以判斷位置上或者顏色上的差異。
20
21
0 2000 4000 6000 8000 10000 12000 14000
差
22
由表 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)當
23
成我們的測量標準,所使用的單位為毫秒(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
24
成像時間為 437.36 毫秒、解析度為 360,000,而三角片個數為 4968,所以我們可 以得到平均每片三角形需要 156.83 次浮點數運算,而 intersection 方法占了整個演 算法大約 58.02%,所以其實我們所採用的演算法本身已經相當精簡。 tracing 簡稱為 SBRT、Shader based rasterization 簡稱為 SBRN。
場景
Cube Sphere Teapot Bunny Car
25
圖 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,假設沒有其他因
0 2000 4000 6000 8000 10000 12000 14000 執
26
點數運算(即 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
SBRT執行時間
5.5 27.5 58.5 292.5 735.3
SBRN 執行時間
2.5 10.5 22.5 127.5 260.5
附註 三角片單位為個數,而執行時間單位為毫秒。
表 5.8:封閉式場景速度結果表
27 都需要做計算之下,Shader based ray tracing 其實跟 Shader based rasterization 速度 差距在 10,000 片左右,不會超過 3 倍。 ray tracing 會演變成兩種方法:One Pass Rendering Algorithm 和 Hybrid Rendering
0
0 2000 4000 6000 8000 10000 12000
執