存取 TD 光線追蹤功能的方式,與目前執行紋理取樣和篩選的方式非常相似。
GPU 的指令集中新增了兩個新指令。
- image_bvh_intersect_ray
- image_bvh64_intersect_ray
BVH 描述元
BVH 紋理描述元為 128 位元,其配置如下表所示。 | 欄位 | 位元 | 大小 | 資料 | |---|---| | BVH 基底位址 | 39:0 | 40 | BVH 的基底位址:以 256 位元組對齊。例如,0 = 0x0、1 = 0x100、2 = 0x200。 | | 未使用 | 54:40 | 15 | 必須為零。 | | 方塊擴大量 | 62:55 | 8 | 在光線-方塊測試期間要加入的 ULP 數量,以不帶正負號的整數編碼。 | | 已啟用方塊排序 | 63 | 1 | 光線/AABB 測試結果是否需要排序。 | | 大小 | 105:64 | 42 | BVH 中的 BVH 節點數量減 1。在存取時強制執行界限檢查。 | | 未使用 | 119:106 | 17 | 必須為零。 | | 三角形傳回模式 | 120 | 1 | 0:三角形傳回模式 0。1:三角形傳回模式 1。詳細資訊請見後面章節。 | | 未使用 | 122:121 | 2 | 必須為零。 | | 大型頁面 | 123 | 1 | 表示所有使用的記憶體頁面都小於或等於 64 KB。由於 XBOX 驅動程式不支援小於 64 KB 的頁面大小供 GPU 存取,因此此值必須一律為 1。 | | 類型 | 127:124 | 4 | 必須設定為 0x8。 |BVH 節點類型
先前所述的光線交集指令不會透過 VGPR 接受幾何 (AABB 或三角形) 作為輸入。而是由 32 位元位址 (「node_pointer」) 指定要針對 BVH 中的哪個節點執行交集測試。此方法的好處是,TD 可以將記憶體作業和交集測試融合成一項作業。由於最大的節點大小為 128 位元組,替代方法將必須載入、儲存和傳輸額外 32 個 VGPR 的「幾何」承載資料,再加上已用於光線資料的 11 個 VGPR。若 image_bvh_intersect_ray 指令需要最多 43 個 VGPR 的輸入,佔用率將會受到嚴重影響。 因此,硬體原生理解三種規定格式的 BVH 節點。- FP16 AABB 節點 (儲存 4 個 AABB):64 位元組
- FP32 AABB 節點 (儲存 4 個 AABB):128 位元組
- 三角形節點 (儲存最多 4 個三角形):64 位元組
三角形節點格式 (節點類型 0、1、2 和 3)
下列章節與硬體支援相符,不過 XDXR 決定每個分葉節點只使用兩個三角形,並將中繼資料儲存在其餘項目中。_
- 三角形 0:
- 三角形 1:
- 三角形 2:
- 三角形 3:

TD 只會針對節點內儲存的四個三角形之一執行光線/三角形交集測試,這與光線/AABB 測試會測試全部四個 AABB 的行為不同。要針對四個三角形中的哪一個進行交集測試,是在叫用 image_bvh_intersect_ray 時由「node_pointer」的最低 3 個位元指定。這些值如下表所示。
交集傳回資料
當 BVH 描述元中的「三角形傳回模式」設定為 0 時,傳回的四個 VGPR 包含下表所示的資料。
當 BVH 描述元中的「三角形傳回模式」設定為 1 時,傳回的四個 VGPR 包含下表所示的資料。
命中狀態可以透過計算 (t_num/t_denom) 是否小於 ray_extent 來推斷。
在三角形傳回模式 1 中,BVH 節點的「triangle_id」欄位會用來重新對應頂點在三角形節點中儲存的順序與提供給 BVH 建置器的順序。例如,給定下列索引緩衝區,這個四個三角形/五個頂點的序列可以儲存在單一三角形節點中 (其中 0 = V0、1 = V1、2 = V2、3 = V3、4 = V4)。
, , , ,
不過,第二個和第三個三角形是硬體所定義之隱含順序的旋轉。共同頂點 (V2) 在硬體所定義的三角形 1 (V1,V3,V2) 中是第 3 個頂點,但在輸入索引緩衝區中是第二個指定的。結果是「I」和「J」重心座標必須相對於索引緩衝區中的輸入 ,而不是硬體中三角形 1 的隱含順序 。
為了減輕此問題,三角形節點中的位元組 63:60 改為定義 4 組「重新對應」位元,告訴硬體 I 和 J 重心座標應該相對於三角形中 3 個頂點中的哪一個。為此目的對位元組 63:60 的解譯如下表所示。
| 欄位 | 位元 | 大小 | 資料 | |---|---| | 三角形 0,「I」來源頂點 | 1:0 | 2 | 0:「I」是 V0 的重心權重。1:「I」是 V1 的重心權重。2:「I」是 V2 的重心權重。3:未使用。 | | 三角形 0,「J」來源頂點 | 3:2 | 2 | 0:「J」是 V0 的重心權重。1:「J」是 V1 的重心權重。2:「J」是 V2 的重心權重。3:未使用。 | | 未使用 | 7:4 | 4 | 4 個位元的可用空間。可用於任何用途,不需要任何特定值。 | | 三角形 1,「I」來源頂點 | 9:8 | 2 | 0:「I」是 V1 的重心權重。1:「I」是 V3 的重心權重。2:「I」是 V2 的重心權重。3:未使用。 | | 三角形 1,「J」來源頂點 | 11:10 | 2 | 0:「J」是 V1 的重心權重。1:「J」是 V3 的重心權重。2:「J」是 V2 的重心權重。3:未使用。 | | 未使用 | 15:12 | 4 | 4 個位元的可用空間。可用於任何用途,不需要任何特定值。 | | 三角形 2,「I」來源頂點 | 17:16 | 2 | 0:「I」是 V2 的重心權重。1:「I」是 V3 的重心權重。2:「I」是 V4 的重心權重。3:未使用。 | | 三角形 2,「J」來源頂點 | 19:18 | 2 | 0:「J」是 V2 的重心權重。1:「J」是 V3 的重心權重。2:「J」是 V4 的重心權重。3:未使用。 | | 未使用 | 23:20 | 4 | 4 個位元的可用空間。可用於任何用途,不需要任何特定值。 | | 三角形 3,「I」來源頂點 | 25:24 | 2 | 0:「I」是 V2 的重心權重。1:「I」是 V4 的重心權重。2:「I」是 V0 的重心權重。3:未使用。 | | 三角形 3,「J」來源頂點 | 27:26 | 2 | 0:「J」是 V2 的重心權重。1:「J」是 V4 的重心權重。2:「J」是 V0 的重心權重。3:未使用。 | | 未使用 | 31:28 | 4 | 4 個位元的可用空間。可用於任何用途,不需要任何特定值。 |
由於 triangle_id 位元用於將重心座標重新對應到所需的頂點,因此 triangle_id 位元無法再用來儲存基底三角形識別碼。由於後續的著色計算通常需要可用的三角形識別碼 (例如,擷取紋理座標 (UV) 和法線等頂點/基本型別資料),因此這項資料必須儲存在個別的結構中並手動擷取。
FP16 AABB 節點格式 (節點類型 4)
FP32 AABB 節點格式 (節點類型 5)
FP16 和 FP32 AABB 交集傳回資料
如果 BVH 描述元中的「已啟用方塊排序」設定為 0,下表描述傳回的 4 個 VGPR 及其用途。
如果 BVH 描述元中的「已啟用方塊排序」設定為 1,下表描述傳回的 4 個 VGPR 及其用途。
其他資訊
- _不_要求 wave 中所有作用中的執行緒都要求相同的節點位址或相同的節點類型進行交集。在同一個指令中,有些執行緒可以要求光線/三角形交集測試,而其他執行緒則執行 FP16 或 FP32 AABB 交集測試。
- TD 內執行的所有作業都使用單精確度浮點數完成。
- 所有光線/AABB 和光線/三角形交集測試都是水密的。
- 非作用中的通道大致上可視為「免費」,不會在 TD 內耗費週期。執行下列動作可讓通道變成非作用中:
- 使用執行遮罩 (也就是流程控制)
- 將下列任何分量設定為 NaN:光線方向、光線反向方向、光線原點和光線範圍
- 將下列任何分量設定為 Inf:光線原點
