《暗黑破壞神 永生不朽》透過硬體光線追蹤技術提升影像品質

《Diablo Immortal》是一款免付費多人對戰動作角色扮演遊戲 (ARPG),由 Blizzard EntertainmentNetEase 共同開發。《暗黑破壞神 永生不朽》是《暗黑破壞神》系列的全新篇章,於 2022 年推出。這款遊戲填補了《Diablo 2》和《Diablo 3》之間的故事空白,並圍繞著世界之石的碎片展開全新冒險,玩家將探索聖所大陸,對抗惡魔和墮落勢力。

隨著行動 GPU 架構的創新和硬體加速功能的突破,光線追蹤技術正逐漸從電腦遷移至行動裝置,成為高保真度圖形算繪的核心驅動力之一。計算物理上真實的動態反射需要大量運算,但專用硬體單元可在電力受限的行動平台上執行這項作業。這項技術會即時追蹤光線在場景中傳播的路徑,準確模擬鏡子、金屬和液體等複雜表面的反射行為。光線追蹤可克服傳統光柵處理方案的空間限制和近似誤差,並支援動態光源、畫面外物件和多層反射的全球一致表達方式。

行動裝置上的硬體光線追蹤

硬體光線追蹤技術主要包含兩種實作模式:光線追蹤管道光線查詢

光線追蹤管道會透過專屬著色器階段 (光線產生 / 交集 / 最近命中著色器) 建立完整管道。雖然可以實現精確的光線交互控制,但光線追蹤管道需要獨立的管道設定,因此會增加開發複雜度。

另一方面,光線查詢可讓光線查詢直接從傳統運算片段著色器啟動,因此是行動裝置光線追蹤的核心技術。由於不需要使用個別管道,因此光線查詢不僅可大幅簡化開發程序,還具有三項主要優點:

  1. 提供與異質運算環境和非完整的光線追蹤硬體的相容性
  2. 支援在任何著色階段隨選叫用光線追蹤
  3. 減少資源使用量,滿足行動平台的頻寬和電力限制,並為行動遊戲中的進階效果 (例如動態全域照明和即時反射) 提供可行基礎

Diablo Immortal 會使用 Vulkan 充分發揮 GPU 的硬體光線追蹤功能。遊戲會即時計算光線穿過場景的路徑,並考量複雜的材質屬性,以便在 Android 裝置上實現突破性的即時反射效果。

圖 1. 已開啟光線追蹤反射的場景。
圖 2. 關閉光線追蹤反射的場景。

加速結構

加速結構是硬體光線追蹤的核心。加速結構可透過階層式資料組織,大幅提升光線交集測試的效率。

系統通常有兩個層級:頂層加速結構 (TLAS) 和底層加速結構 (BLAS):

  • TLAS 扮演場景管理員的角色,透過記錄所有 BLAS 例項的空間轉換矩陣 (包括位置、旋轉和縮放),TLAS 可實現動態場景的全域組織。舉例來說,TLAS 可讓開發人員在場景中以不同位置和姿勢分散相同樹木模型的數百個例項,因此開發人員只需更新每個影格中移動物件的轉換矩陣,而非重建幾何圖形。
  • BLAS 做為基本單位:負責有效地編碼單一 3D 物件的幾何細節,透過邊界體階層 (BVH) 演算法建立空間索引結構,以便在光線偵測期間快速略過不相關的區域。

這種階層式設計可讓光線追蹤管道形成有效的偵測鏈結,鏈結內容為 ray ==> TLAS (粗篩物件例項) ==> BLAS (精確交集)

動態和靜態模型的分離是降低加速結構建構成本的關鍵:

  • 靜態模型:BLAS 只需在初始化階段建構一次,即可在後續場景載入作業中直接重複使用。為避免大型場景的載入延遲,您可以使用構框的非同步預建技術,將 BLAS 建構工作分散到多個影格。
  • 動態模型
    • 以骨架動畫為主 - 每個影格都需要由運算著色器以平行方式計算著色頂點資料,以產生新的頂點緩衝區,然後觸發對應 BLAS 的增量更新,避免完全重建以改善效能。
    • 剛體轉換:如果只涉及平移/旋轉/縮放轉換,就不需要修改 BLAS,只要在 TLAS 中更新其世界轉換矩陣,然後觸發 TLAS 快速更新程序即可。

定期重建功能對於維持光線追蹤動態場景中的加速結構效率至關重要。當動態物件在幾何拓撲中發生重大變化 (例如變形或大規模頂點位移) 時,原始空間分割作業可能會失敗,進而降低在光線穿越期間的碰撞偵測效能。因此,必須每隔 N 個影格觸發一次高度動態 BLAS/TLAS 的完整重建作業,而非增量更新。

最後,為了最佳化光線追蹤算繪的效能,請採用以角色可視區域為基礎的動態 TLAS 建構策略:只有角色的有效半徑門檻內的模型才會納入 TLAS,以減少光線交集計算的核心額外負擔。

光線追蹤反射

與傳統技術 (例如螢幕空間反射 (SSR) 和平面反射 (在單一維度投影場景的簡單表面)) 相比,光線追蹤反射具備多項優點。光線追蹤反射功能會以物理方式模擬光線路徑,準確擷取場景內外動態物體,支援來自曲面和非平面表面的自然反射,並啟用鏡子等多種光線反彈效果。相較之下,SSR 僅限於畫面上顯示的資訊,而平面反射在複雜場景中容易發生視覺錯誤或扭曲。

圖 3 翅膀在泳池中倒映的樣子。
圖 4. 怪物的反射。

從原則上來說,光線追蹤反射與傳統 SSR 相似:光線追蹤反射會以逐像素的方式,沿著視線反射方向發射光線,並計算光線與場景物件的交集。光線查詢 API 傳回的交集點包含幾何資訊 (包括執行個體 ID、幾何圖形索引和基本圖形索引) 和點陣化參數 (重心座標),但不包含像素顏色資料。一般解決方案會使用無繫結資源繫結技術,將場景的所有紋理和材質參數預先編譯為全域索引陣列。使用光線查詢傳回的幾何 ID,您可以查詢對應材質的物理屬性 (例如法線圖和粗糙度),然後結合重心座標插補,計算表面著色資訊,並透過算繪重建交叉處的實際色彩值。

不過,在導入過程中,Diablo Immortal 團隊發現了兩個重大技術問題:

  1. 強制統一照明模型,這會與專案歷程中累積的各種著色系統產生衝突,並導致鏡面反射材質與原始材質不相符。
  2. 光柵化階段的運算分支效率會因頂點格式多樣化而降低,這是行動裝置效能預算緊縮時的重要問題。

Diablo Immortal 團隊創新地引入了可視度緩衝區,將幾何運算與著色計算分開:

  • 光線追蹤階段:透過光線查詢,即時擷取像素層級的光線命中資訊。交叉點的 3D 空間 ID (InstanceIDPrimitiveIndex) 會編碼為精簡的顯示 ID,並寫入螢幕空間緩衝區。
  • 著色階段:與頂點和像素著色器執行的作業類似,會動態剖析可見度緩衝區中的幾何圖形 ID,擷取原始模型的頂點屬性 (例如 UV 和法線) 和物理材質地圖,最後執行與材質類型相關聯的著色計算。

這個解決方案可讓藝術素材資源連結至光線追蹤反射系統,而無須修改頂點格式或著色器。

特定轉譯步驟

Ray 查詢傳遞

對應於光線追蹤階段,並為螢幕空間反射產生可見度緩衝區:

  • Color0
    • 格式:R32G32UInt
    • R = TriangleID,G = Barycentrics
圖 5. 可見度緩衝區。
  • 厚度:
    • 格式:Depth32F
    • D = EncodeAsFloat(InstanceIdx, GeometryIdx)
    • 交集的材質 ID 會以 32 位元浮點編碼,並寫入深度緩衝區,以便在材質的深度編碼比對偵測技術的下一個階段使用
圖 6. 已編碼的深度。

與運算著色器相比,像素著色器中的光線查詢具有以下優點:

  • 管道整合:管道會直接嵌入現有的正向/延後轉譯管道,維持轉譯管道狀態的連續性。
  • 行動頻寬最佳化:針對以行動方塊為基礎的架構,當光線命中資料寫入 RenderTarget 時,可觸發晶片上的無損壓縮功能,相較於傳統運算著色器輸出至緩衝區,可減少記憶體頻寬消耗。
  • 光線數量控制:透過預先計算階段搭配網版測試,即可標記並拒絕非反光區域。

解析憑證

在著色階段 (請參閱「光線追蹤反射」),Diablo Immortal 團隊使用深度測試硬體單元,並在連續批次中執行材質著色,以便快速比對。

系統會針對每個材質發出全螢幕繪圖通道。頂點著色器會動態重建目前材質的編碼 ID。使用深度相等測試,系統會將 ID 與深度緩衝區中的編碼值進行比較,並只保留編碼值完全相符的像素,也就是屬於目前材質例項的像素。保留的像素會執行對應的材質著色器。

接著,在像素著色器中實作高精確度材質重現功能:

  • 幾何資料解碼:從可見度緩衝區中擷取三角形 ID (MeshID + PrimitiveID) 和重心座標,並從頂點緩衝區動態載入對應三角形的頂點屬性 (位置、UV、法線等)。由於每個模型都會以獨立材質進行著色,因此不需要綁定等進階功能。
  • 表面參數重建:使用重心座標插補,計算交集處的 UV 座標。執行軟體算繪作業,根據內插的 UV 取樣地圖。
  • 著色計算重複使用:直接重複使用現有的著色器程式碼,以便維持與主要轉譯管道相同的材質邏輯。
圖 7. 已解決的反射。

最後,實際參與反射計算的模型只占情境的一小部分。GPU 傳回的反射模型 ID 資料可異步讀取,以便排除未參與反射的模型/材質,有效減少著色階段中的繪圖呼叫次數 (當材質和網格提交至 GPU 進行繪圖時,就會發生繪圖呼叫)。

以物理概念為基礎的鏡面反射

為了達到高保真度的反射效果,系統會根據粗糙度將反射表面分為三種類型:

  1. 無反射:可略過這些表面的反射計算,以節省資源。如果表面非常粗糙,反射就會變得模糊且微弱,因此貢獻就不會很明顯。
  2. 鏡面反射:就像光滑的鏡子一樣,反射的影像清晰且不會模糊。直接從視線方向拍攝反射線。
  3. 光亮反射 — 系統會根據 GGX 重要性取樣模擬具有特定表面粗糙度的反射,這項技術可同時考量運算效率和物理精確度。反射會在發出線條時偏離鏡面反射的主要方向,進而提高亮部區域的取樣效率。

為了在有限的耗電量下達到可用的圖像品質,Diablo Immortal 團隊採用了 1SPP+Denoiser 解決方案。也就是說,Diablo Immortal 團隊為每個像素取樣一次,然後使用時間/空間雜訊消除演算法,平滑低取樣率帶來的大量雜訊。

Diablo Immortal 團隊選擇了 AMD FidelityFX Denoiser 中的 Reflection Denoiser,這是一款高效能去雜訊器,可針對光線追蹤反射和螢幕空間反射進行最佳化。反射去噪處理器的核心優勢在於去噪處理器的時空混合雜訊消除演算法:透過融合目前影格和歷史影格資料 (根據動作補償),並結合空間篩選技術 (例如差異導向邊緣保留篩選),反射去噪處理器可有效消除雜訊,並在非常低的取樣率下輸出平滑的反射效果。

為了配合自行開發的算繪管線特性,並符合行動裝置的嚴格效能限制,Diablo Immortal 團隊在整合 AMD FidelityFX 反射降噪器時,已實作指定的簡化和架構調整。

使用 Vulkan 進行高保真度光線追蹤

Diablo Immortal 可在多種支援 Vulkan 的 Android 裝置上執行,Diablo Immortal 團隊也善用創新的 GPU 硬體光線追蹤功能。Vulkan 減少了開發成本和摩擦,讓 Android 使用者能更輕鬆地取得優質的《Diablo Immortal》內容和遊戲體驗。

開始在 Vulkan 上使用光線追蹤

如同《Diablo Immortal》所示,在 Android 上實現光線追蹤效果,需要在支援的硬體上運用 Vulkan API。如果開發人員有興趣直接使用 Vulkan,可以參閱 ARM 的「Learn about Ray Tracing with Vulkan on Android」,或 Qualcomm 的「Adreno GPU on Mobile: Best Practices」中的「Raytracing」 一節。如需 API 詳細資料,請參閱官方 Khronos Vulkan 中的光線追蹤規格。

針對以引擎為基礎的開發作業,Unreal Engine 與 ARM 合作,提供在行動裝置上使用 Lumen 硬體光線追蹤的實驗性支援Unity 支援 Android 硬體光線追蹤功能,但仍在持續改進中,請密切留意 Unity 的更新。