Com2uS 使用 Vulkan 改善圖像品質

Com2uS Chronicles 的遊戲標題標誌螢幕截圖。

Com2uS 的《魔靈召喚:克羅尼柯戰記(美國

Vulkan 是新型的跨平台 3D 圖形 API,旨在盡可能減少裝置圖形處理硬體與遊戲間的抽象化情形。與 OpenGL ES 相比,Vulkan 的 CPU 負擔較低,而 Vulkan 的功能範圍更廣。

圖 1. 遊戲螢幕截圖。
圖 2.遊戲內影片。

轉譯功能

Com2uS 為《魔靈召喚:克羅尼柯戰記》開發進階轉譯功能,包括:

  • 使用預先轉譯光源調節功能自訂延遲轉譯系統,同時在檢視視線範圍中最多同時顯示十六個主動光源
  • 間接算繪流動方法 (稱為 Clay),可一次繪製許多網格、材質和紋理
  • 大量使用運算著色器執行預先算繪工作
  • 可依據相機移動、圖形選項和執行階段效能,動態調整進行中的陰影轉譯和後處理效果

行動硬體設備

《魔靈召喚:克羅尼柯戰記》會在 Android 裝置、個人電腦和專用遊戲主機中使用相同的轉譯器。為了在行動裝置硬體上達到最佳效能,Com2uS 調整了轉譯設定,包括繪製深度和密度。為配合在 Android 11 (API 級別 30) 及以下版本上執行的特定裝置,Com2uS 建立了某些著色器的替代版本,並使用了較少的執行個體計數。「魔靈召喚:克羅尼柯戰記」也會使用 Android 的自動調整式效能功能,因應裝置溫度條件動態調整圖形選項。

僅使用 Vulkan 的原因

Com2uS 只將 Vulkan 用於《魔靈召喚:克羅尼柯戰記》,原因如下:

  • 最低裝置需求排除在不支援 Vulkan 支援的舊款、效能較低的裝置
  • 自訂 Unity 引擎內建的轉譯管道 (BiRP) 必要功能,功能只能在遊戲的 Vulkan 後端使用
  • 使用運算著色器輸出內容和著色器儲存空間緩衝區物件 (SSBO) 的算繪功能,可以在 Vulkan 上實作,但不適用於 OpenGL ES

運算工作負載

魔靈召喚:克羅尼柯戰記會執行大量的運算著色器工作,以產生轉譯資料。運算著色器適用於:

  • 物件收錄
  • 碰撞檢查
  • 動畫工作
  • 產生間接轉譯資料

產生的運算資料會寫入 Unity 引擎 RWBuffer 物件。為達到最佳效能,魔靈召喚:克羅尼柯斯會透過單一分派執行所有運算工作,而這需要同時使用多個 RWBuffers。由於 Unity BiRP OpenGL ES 後端僅支援單一 RWBuffer,因此這個方法只能使用 Vulkan。

針對算繪產生的資料集,通常大於統一緩衝區物件 (UBO) 的裝置大小限制。「魔靈召喚:克羅尼柯戰記」會改用具有更大的容量限制的著色器儲存空間緩衝區物件 (SSBO)。但是,將 SSBO 繫結至頂點階段作業需要唯讀 SSBO 支援。OpenGL ES 僅支援讀取/寫入 SSBO,而 Vulkan 可將 SSBO 標示為唯讀。

使用 Clay 的間接例項算繪

針對魔靈召喚:克羅尼柯戰記,Com2uS 開發了將多種材料、網格和紋理批次處理成單一繪圖呼叫的方法。Com2uS 將這個系統稱為「Clay」。Clay 大幅減少繪製呼叫,成功將遊戲效能提升 30%。

Clay 會在縮減和碰撞階段開始建構相容的可見可算繪物件清單。然後, Clay 會在 SSBO 中,為每個已識別的物件產生轉譯資訊。這項程序會使用運算著色器執行,啟用 Unity 轉譯器 DrawMeshInstancedIndirect 函式的間接例項算繪。使用間接轉譯時,執行個體資訊和執行個體計數參數會直接在 GPU 上產生。繪製物件時,Clay 不會繫結傳統物件網格,而是以下圖所示的錐狀網格:

圖 3. 圓錐網格。

接著,Clay 會使用運算著色器產生的頂點轉換資料繫結 SSBO,在頂點著色器中轉換錐形網格。將 SSBO 繫結至頂點階段,需要使用 Vulkan。Clay 可以使用多個轉換後的介面來轉譯單一物件。物件的複雜度決定了圓錐數

圖 4. 錐形網格如何轉換成樹狀結構。

物件的材質資料會在運算著色器產生的另一個緩衝區中批次處理。緩衝區會繫結至片段著色器。而要繪製物件的紋理則是在紋理陣列中設定。物件紋理的陣列索引會包含在物件的材質資料中。在理想情況下,Clay 最多能轉譯七次繪圖呼叫:

  • 靜態物件
  • 動畫物件
  • 陰影 (4 次疊代)
  • 回想

Unity 搭配 Vulkan

《魔靈召喚:克羅尼柯戰記》展示了 Unity 遊戲引擎和 Vulkan 圖形 API 的強大組合,可讓開發人員在 Android 裝置上呈現高階控制台品質圖像。