與 Windows 上 DXR 的差異
建立全域根簽章時,必須在根簽章描述上設定額外的旗標:D3D12XBOX_ROOT_SIGNATURE_FLAG_RAYTRACING。此旗標目前無法在以高階著色器語言 (HLSL) 指定的根簽章中設定,必須在根簽章序列化之前於程式碼中設定。 XDXR 並未完整支援 DXR 1.1 RayQuery.TraceRayInline() 功能,不過我們提供一個模擬 RayQuery API 的標頭檔 (XDXRStandaloneTraverse),對於大部分 RayQuery 程式碼應能提供非常簡單的移植體驗。具體差異請參閱 XDXR 獨立周遊。 XDXR 目前不支援RAY_FLAG_SKIP_TRIANGLES、RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES 或 D3D12_RAYTRACING_PIPELINE_FLAGS 系統。未來可能會有所修訂。目前在 XBOX 上,批次 TLAS 建置可以非常快速,在此情況下建置個別的 TLAS 會比略過節點提供更好的周遊效能。
XDXR 支援數個延伸功能,可直接從 BVH 或周遊查詢狀態,而不需要使用承載資料來儲存。
若要使用這些延伸功能,請在光線追蹤著色器的頂端預先宣告下列一或多個函式。
XDXR 的設計
從高層次來看,XDXR 的實作可視為分成兩個部分:周遊核心 (Traversal Core) 與「排程器」(Scheduler)。周遊核心
周遊核心是 XDXR 的包圍體階層 (BVH) 周遊實作。它負責處理周遊以及高層次的決策,例如要呼叫哪些著色器 (例如最近命中與任意命中著色器)。它不處理實際呼叫著色器的機制,那是排程器的責任。 XDXR 使用 BVH4 表示法來儲存其加速結構。雖然也可以選擇其他 BVH 格式,但此格式符合 XBOX Series X|S 用於執行光線/軸對齊包圍盒 (AABB) 交集測試的自訂硬體所使用的格式。如需詳細資訊,請參閱光線追蹤硬體設計。周遊
XDXR 目前未實作任何形式的光線重新封裝、排序或重新排列。從叫用光線產生著色器的那一刻起,任何未主動追蹤光線的執行緒都是 wave 中的「非作用中通道」,浪費了執行有用工作的機會。從概念上來說,光線是在指定的執行緒上產生的。後續對任何著色器的叫用或遞迴光線都存在於同一個執行緒上。如果光線產生著色器在 wave 的通道 0 上產生兩條光線,而在其他所有通道上沒有產生光線,則執行緒 0 必須依序完成其兩條光線,而其他所有執行緒則保持非作用中狀態。 XDXR 目前公開兩種 BVH 周遊演算法。預設演算法稱為「發散」(Divergent) 周遊,是最通用的解決方案,適合光澤反射等發散的工作負載。對於TraceRayInline(),對應的標頭為 XDXRStandaloneTraverseShortStack.hlsli。對於陰影光線或非光澤反射等高度一致的工作負載,2022 年 6 月 GDK 提供了新的「混合」(Hybrid) 周遊演算法。此演算法使用純量分支執行 TLAS 周遊,只有在進入 BLAS 時才會發散。混合周遊可能會在某些內容與光線追蹤工作負載上大幅提升效能。
若要啟用「混合」周遊,請將 XBOX_RAY_FLAG_COHERENT_RAYS_HINT 加入 DXR 1.0 TraceRay() 光線旗標中。光線旗標與 TLAS 指標必須一致 (uniform) 才能啟用此周遊類型。對於 TraceRayInline(),對應的標頭為 XDXRStandaloneTraverseHT.hlsli。
