第四章 使用 OpenCL 實作有加速結構之光線追蹤程式
4.2 步驟二
在得到步驟一讀取進的模型三角片資料後,就可以準備建構 BVH-tree 加速 結構,由於在前文的文獻探討已經對 BVH-tree 的內容有所簡介,在這步驟的實作 細節主要放在分類出新節點的方法,本論文實作的 BVH tree 是採用 Top-down 的 方法來建構,建立時是在程式的 Host 端完成,是一般的 C++程式,所以是可以使 用遞迴的(kernel 裡為 device 端無法使用遞迴),其基本的方法就是將上層的邊界 框(bounding box)中的物件,使用特定的方法分類出兩群,再形成兩個下層的新
bounding box 後,遞迴執行這個步驟直到指定的樹深度,而這裡介紹分類出新節 點的方法,主要來自於 Physically Based Ray Tracer(PBRT) [3]的做法,主要有二種:
(1)
以數量來平分出兩群
圖 4.2.1 以數量來分類的新節點
1000
500 500
250 250 250 250
將上層節點的物件以 bounding box 的最長軸排序後,根據數量平分成兩群,
然後再重新計算出新的 bounding box,形成新的節點,這個過程使用遞迴重複多 次就能完成樹的資料結構,這樣實作的好處有:程式撰寫起來非常的簡單、樹的資 料結構建立起來相當的快、各個葉節點的物件數量很接近;但壞處就是: bounding
box 無法達到最佳,會將一些不必要的區域也劃入,使得節點和光線做交點測試 時,較容易被打到,因此需要做較多的物件交點測試,使得縮短的運算時間變得 有限。
(2)使用表面積啟發式算法(Surface Area Heuristic,SAH)來分類
圖 4.2.2 同個 bounding box 以數量平分與使用 SAH 來分類
由上圖就可以看出以數量平分時的缺點,明顯的劃入了一大片根本沒有三角 形物件,假如光線從圖示上的方向行進,則左圖就會因為較差的劃分法要去檢查
A 節點,就因此增加了運算的成本; 右圖較優良的劃分法則完全不用去檢查任何 節點,當然就能節省更多的運算時間。
A A
B B
RAY RAY
使用 SAH 劃分法的目的,就在於要找出最好的劃分,但在一個 bounding box 中根據物件的數量,有可能會有很多劃分法可以將物件分成兩群,總不可能將每 種劃分法都試過一次後再去分類,更何況這種劃分在每一層的樹狀結構都要實作,
全部加總起來的運算量就會非常龐大,因此根據研究,就提出了這個公式,以用 來評估當下這種劃分法的成本(cost):
cost(A, B) = p(A) × n in A + p(B) × m in B
其中 A、B 各代表左子樹與右子樹的區域,n 為 A 區下的物件個數,m 為 B 區下的物件個數,p(A)為光線擊中 A 區域形成的 bounding box 機率,p(B) 則為光 線擊中 A 區域形成的 bounding box 機率,cost(A,B)除了代表成本外,也代表這光 線打到 A 區與 B 區的 bounding box 機率,一個好的劃分法,避免劃入不必要的區 域進入 bounding box 外,更應該盡量讓光線行進時無法碰撞到 bounding box,以 期望可以做更少交點測試,縮短更多的運算時間,所以 cost(A,B)這個值要越小越 好,但前面有提到不可能把所有劃分法都去嘗試,算成本時也是同樣道理,在 PBRT 中是把物件分成 12 個群再去試其中的劃分點,而本論文則是採用分成數量 接近 100 的群再去測試劃分點。
圖 4.2.3 父節點 C 與劃分出有重疊區域的子節點 A、B
A
B
C
然而 p(A)、p(B)這兩個光線擊中 bounding box 機率要怎麼去推估?這裡先做 出了一個假設:如果物體的表面積越大,那光線擊中物體的機率就越大,是一個呈 現正相關的情況,套用在 BVH tree 的話,則變為 bounding box 的表面積越大,則 越容易被光線擊中,基於前面的假設,此處先令父節點 C 區域的表面積為 S(C),
子節點 A、B 的表面積分別為 S(A)與 S(B),所以光線擊中父節點 C 底下的子節點
A 的機率為 S(A)/S(C),同理,擊中子節點 B 的機率為 S(B)/S(C),當然實作時,
會期望每次的父節點劃分後,都會讓兩個子節點的總表面積越來越小,讓光線打 到的機率越來越小,但實際上,也可能發生劃分後總表面積反而變大的情況,因 為會出現如示意圖的狀況,A 與 B 的 bounding box 發生了重疊,部分面積就被重 複的計算,這當然不是樂見的情況,當物件數量變的較多、位置又相當相近時就 無法避免,但整體來說還是能得到較佳的劃分。
雖然使用了導入和表面積相關的 SAH 方法後,可以得到較佳的劃分,相對的 就必須要付出額外的成本,這個成本就是在建立樹狀結構時需要花費較久的時間,
因為多了要計算出最佳劃分點的時間,要注意的是:這個評估的工作是使用遞迴方 法實作,所以不能給定太多的劃分點去評估,否則隨著遞迴的時間複雜度增長,
反而使得建樹的時間超過渲染時間許多而適得其反。