Skip to main content

簡介

每個底層加速結構 (BLAS) 的根部都會儲存一個包圍整個 BLAS 的 AABB。此 AABB 與幾何位於相同的空間,也就是物件空間。將 BLAS 的執行個體插入頂層加速結構 (TLAS) 時,必須在世界空間中決定該執行個體的邊界。最單純的做法是將物件空間 AABB 的各個角點轉換到世界空間,再形成新的 AABB。如果轉換中包含任何旋轉,就會使世界空間中的 AABB 膨脹,增加其表面積,導致更多誤判 (false positive) 的交集。若要取得真實的世界空間 AABB,則必須將 BLAS 中包含的每個頂點都轉換到世界空間再加以包圍。這並不實際,特別是在執行階段。 有一種折衷方案可以改善世界空間 AABB 的貼合度,且執行階段成本遠低於真實值做法。此方案需要預先建構一個包圍 BLAS 的凸包 (由點構成的晶格)。我們不必將 AABB 從物件空間旋轉到世界空間,而是可以旋轉此晶格,並在世界空間中找出其邊界。晶格越精細,執行個體的世界空間 AABB 就能越接近真實值。

k-DOP

k-DOP 是一種 ‘k’ 維的離散定向多面體 (discrete oriented polytope)。這是一種具有 ‘k’ 個邊界平面的廣義包圍體。軸對齊包圍盒 (AABB) 與定向包圍盒 (OBB) 都是 6-DOP 的例子,由三組邊界板 (成對的邊界平面) 所構成。二十面體 (20 面骰子) 則是 20-DOP 的例子。

頂點映射 (Apex Point Map)

如果 k-DOP 代表包圍網格的平面,則頂點 (apex point) 就是其頂點。頂點映射是指一種在任何給定方向上查詢頂點的方法。之所以稱為「頂點」(apex),是因為它是包圍體上的極值點。

實作

我們將運用 k-DOP 與頂點映射的概念,產生一個緊密貼合的凸包作為包圍體。我們不會將所有凸包頂點轉換到世界空間,而是將基底向量投影到頂點映射中,以取得這些方向上的極值點。我們只需要轉換這六個點,因為它們是世界空間 X、Y 和 Z 軸上最極端的點。 XDXR 會先在暫存記憶體中建置 k-DOP。這與形成 AABB 類似。對於 k-DOP 中的每個平面,每個頂點都會投影到其法線上,並計算與原點的最大距離。法線與距離即定義了邊界平面。理想情況下,k-DOP 平面法線應均勻分佈在單位球面上,但為了方便以及易於產生查閱資料表,我們改為取立方體表面上的點來形成法向量。立方體的各面會細分為 NxN 個正方形格子,其中 N 為細分係數。(請注意,N=1 等同於 AABB。) k-DOP 的大小 (以 2022 年 6 月 GDK 為準) 可以從細分係數計算得出。細分立方體一面上的頂點數為 (N+1)2。 SizeOfKDOP = (N + 1) * (N + 1) * 6 * sizeof(float) 建構 k-DOP 之後,我們便可為由三個平面法線所包圍的區域形成頂點。請記住,k-DOP 平面就像多面體的各面,而頂點就是其頂點。若要找出每個頂點,我們會求三個平面的交點。每個細分的正方形區域都有四個平面,因此有兩個頂點。細分立方體的每一面有 2*N2 個頂點。 SizeOfAPM = (2 * N * N) * 6 * sizeof(float3) 注意:最終的 BLAS 中只會保留頂點映射。執行階段不需要 k-DOP。

摘要

當執行個體轉換套用旋轉時,世界空間執行個體 AABB 可能會過於保守。這會使 AABB 的表面積相對於真實值增加。進而因誤判的光線交集增加而對效能造成負面影響。XDXR 實作了一種稱為「頂點映射」(apex point map) 的可擴充技術,以減輕旋轉執行個體對效能的影響。其運作方式是預先計算各種方向上的頂點,用來產生更緊密的旋轉後邊界。雖然頂點映射需要額外的 BVH 儲存空間,但它能隨 BLAS 的複雜度調整,使記憶體增加量只佔總量相對較小的一部分。 顯而易見,提高細分係數是一種取捨:以增加記憶體大小換取更精確的邊界。另外值得注意的是,建置 k-DOP 的成本會隨細分程度上升,複雜度為 O(n2)。更新 BLAS 時,必須在執行階段付出這筆不小的成本。對於可更新的 BLAS,可能建議使用較小的 N,或完全省略頂點映射。對於大型、靜態、離線建置的 BLAS,使用與幾何複雜度成比例的細分係數可能會有幫助。初步估計建議使用介於 2 到 8 之間的值。上限為 15。

參考資料

https://research.nvidia.com/publication/2015-06_apex-point-map-constant-time-bounding-plane-approximation
Last modified on October 6, 2026