BVH加速結構在GPU上的加速效果
來源:投稿網 時間:2024-01-05 10:00:08
實現和比較加速結構。
3.1均勻格柵。
均勻網格是GPU上實現的第一個加速結構。Purcell給出了許多選擇均勻網格作為加速結構的原因,但Purcell并沒有詳細解釋為什么均勻網格比其他加速結構更容易實現硬件。在討論均勻網格的一些主要特性時,我們更清楚地知道為什么均勻網格成為一個好的GPU速度結構。
首先,只有使用簡單的算術操作,每個元素的常規時間才能定位和訪問。這消除了對樹木的常規需求和重復的紋理搜索工作,而紋理搜索相當耗時。
其次,體素的遍歷是通過遞增算術操作完成的。這消除了對堆棧的需求,使我們有可能從光線的起點和距離增加的順序訪問體素。
其次,由于對體素的訪問是沿著光線通過距離增加的,一旦在被訪問的體素中發現交叉點,就可以停止光對體素的全過程,從而提高全過程的速度。
最后,用于遍歷的代碼非常適合向量編寫,而向量形式的編碼風格非常適合GPU指令集。
然而,均勻格柵的缺點是它是空間細分結構的一種特殊情況,多個元素可能包含同一三角形的多個參考。由于不能使用mailbox技術,這意味著需要不止一次測試同一光線和三角形之間的交叉。
3.2KD-treee。
最近,Havran和其他人比較了基于CPU的光跟蹤算法的加速結構。結論是,對于許多不同類型的測試場景,平均而言,KD-tree是最快的。因此,有必要檢查基于KD-tree的GPU光跟蹤算法是否會有類似的結論。
就像均勻網格一樣,KD-tree也是一種空間細分結構。與均勻網格不同,KD-tree使用二叉樹將場景表示為層次結構。
在二叉樹中,我們將內部節點與葉片節點區分開來。葉節點用于表示保存在體素中的體素和三角形引用。一個內部節點用于表示空間區域的某個部分。因此,內部節點包括一個分裂面的兩個子樹的引用,而葉節點只包含一個三角形列表。
KD-tree的創建過程是從上到下的。根據評估函數,場景通過放置分離平面將遞歸分為兩個元素。我們可以通過遞歸的方式遍歷KD-tree,但由于GPU沒有堆棧結構,遞歸策略無法應用。相反,我們可以記住我們沿著光線向上或向下穿越樹木的距離。該策略消除了堆棧的限制,使用CPU完成KD-tree結構的全過程成為可能。
當使用GPU對KD-tree進行遍歷時,KD-tree被表示為像均勻格柵一樣的紋理集合。這意味著有一種保存樹數據的紋理,一種保存三角形列表的紋理,以及保存實際三角形數據的紋理。GPU的遍歷首先調用初始核,然后根據需要多次調用合并后的遍歷并要求交付核。
3.3包圍層(BVH)
給出一些隨機光,通過計算包圍層的平均成本,可以測量包圍層的質量。到目前為止,還沒有構建最佳的包圍層算法,也就是說,如何準確測量包圍層的平均包圍時間并不明顯。
Goldsmith和Salmon提出了一個評價函數,通常稱為表面積啟發函數。他們通過父節點和兒童節點的表面積之比來形式化這種關系,如下:
在這里,hit(n)是光線擊中節點n的情況,Sn是節點n的表面積,c和p分別表示父子節點。
這個評價函數給出了成本估計,當用隨機光線支付同級結構時。由于沒有最好的方法來有效地構建最好的BVH,因此提出了不同的結構技能。下面將列出更常見的方法。
在實踐中,最廣泛應用于包圍體的是軸對齊包圍盒(AABB)。AABB容易實現,同光的求交測試非常快。在描述BVH的創建時,大多數關于BVH的論文通常基于Kay和Kajiya、Goldsmith和Salmon兩個基本想法。Kay和Kajiaya建議自上而下創建BVH。
Goldsmith和Salmon提出了更復雜的自下而上的結構方法。Goldsmith和Salmon指出,BVH的質量與三角形作為輸入傳人的順序有關。因此,他們建議在構建BVH之前隨機擾亂三角形的順序。以下算法是利用Kay/Kajiya的思想創建一個場景的包圍層次:
本文成功地在GPU上實現了用于光跟蹤算法的各種加速結構,并比較了這些加速結構在GPU上的加速效果。作為CPU上第一個光跟蹤器的加速結構,也被證明是最慢的,除非它只包含一個單獨的物體場景。均勻網格不適用于幾何密度很高的場景。此外,對于均勻網格的CPU上的遍歷,還需要大量的數據。Foley和Sugerman認為,對于大多數場景,KD-tree的效率高于均勻網格。然而,在KD-tree的遍歷過程中,無論是重置階段還是回歸階段,片元程序都非常復雜,但這種復雜性也使其在改變場景幾何密度時能夠做出適當的調整。本文實現的BVH是最快的加速結構。BVH加速結構在GPU上比其他加速結構更容易實現。