Diablo Immortal でハードウェア レイトレーシングによる画質の向上

Diablo Immortal は、Blizzard EntertainmentNetEase が共同で開発した、無料のマルチプレイヤー アクション ロールプレイング ゲーム(ARPG)です。Diablo Immortal は、Diablo シリーズの新しい章として 2022 年にリリースされました。このゲームは、Diablo 2Diablo 3 の間のストーリーのギャップを埋め、世界石の破片をめぐる新しい冒険を繰り広げます。プレイヤーはサンクチュアリ大陸を探索し、悪魔や堕落した勢力と戦います。

モバイル GPU アーキテクチャの革新とハードウェア アクセラレーション機能の飛躍的な進歩により、レイ トレーシング技術はデスクトップからモバイル デバイスに徐々に移行し、高忠実度グラフィック レンダリングのコア ドライバの 1 つになっています。物理的にリアルな動的反射の計算は計算負荷が高いですが、専用のハードウェア ユニットを使用すると、電力制限のあるモバイル プラットフォームでも実現できます。この技術は、シーン内の光の伝播経路をリアルタイムでトレースすることで、鏡、金属、液体などの複雑なサーフェスの反射動作を正確にシミュレートします。レイトレーシングは、従来のラスタ化スキームの空間的な制限と近似誤差を克服し、動的光源、画面外オブジェクト、マルチレベル反射のグローバルに整合した表現をサポートします。

モバイルでのハードウェア レイ トレーシング

ハードウェア レイ トレーシング技術には、主に 2 つの実装パラダイム(レイ トレーシング パイプラインレイクエリ)があります。

レイ トレース パイプラインは、専用のシェーダー ステージ(レイ生成 / 交差 / 最も近いヒット シェーダー)を介して完全なパイプラインを構築します。正確なレイ相互作用制御を実現できますが、レイ トレース パイプラインには独立したパイプライン構成が必要であり、開発の複雑さが増します。

一方、レイクエリでは、従来のコンピューティング シェーダーまたはフラグメント シェーダーから直接レイクエリを開始できるため、モバイル レイトレーシングのコア技術となっています。個別のパイプラインを必要としないレイクォーリーは、開発プロセスを大幅に簡素化するだけでなく、次の 3 つの大きな利点があります。

  1. 異種コンピューティング環境と完全でないレイ トレース ハードウェアとの互換性を提供
  2. 任意のシェーディング ステージでレイトレーシングをオンデマンドで呼び出すことをサポート
  3. リソース使用量を削減することで、モバイル プラットフォームの帯域幅と電力の制約を満たし、モバイルゲームでの動的グローバル照明やリアルタイム反射などの高度なエフェクトの実現に役立ちます。

Diablo Immortal は Vulkan を使用して、GPU のハードウェア レイトレーシング機能を利用します。このゲームでは、シーンを通過する光線のパスをリアルタイムで計算し、複雑な素材特性を考慮して、Android デバイスで画期的なリアルタイム反射効果を実現しています。

図 1. レイトレース反射がオンになっているシーン。
図 2. レイトレース リフレクションが無効になっているシーン。

加速構造

アクセラレーション構造は、ハードウェア レイトレースの中核です。アクセラレーション構造は、階層型のデータ編成により、レイの交差テストの効率を大幅に向上させます。

通常、システムには最上位のアクセラレーション構造(TLAS)と最下位のアクセラレーション構造(BLAS)の 2 つのレベルがあります。

  • TLAS はシーン マネージャーの役割を果たします。すべての BLAS インスタンスの空間変換行列(位置、回転、スケールなど)を記録することで、TLAS は動的シーンのグローバルな編成を実現します。たとえば、TLAS を使用すると、デベロッパーはシーン内のさまざまな位置とポーズに同じツリーモデルのインスタンスを数百個分散できます。そのため、デベロッパーはジオメトリを再構築するのではなく、フレームごとに移動オブジェクトの変換行列を更新するだけで済みます。
  • ベース単位としての BLAS - 単一の 3D オブジェクトのジオメトリの詳細を効率的にエンコードする BLAS は、境界ボリューム階層(BVH)アルゴリズムを使用して空間インデックス構造を確立し、レイ検出中に無関係な領域をすばやくスキップできるようにします。

この階層型設計により、レイ トレース パイプラインは ray ==> TLAS(粗いふるいオブジェクト インスタンス)==> BLAS(正確な交差)の効率的な検出チェーンを形成できます。

動的モデルと静的モデルを分離することが、アクセラレーション構造の構築コストを最小限に抑える鍵となります。

  • 静的モデル - BLAS は初期化ステージで 1 回だけビルドする必要があり、その後のシーンの読み込みで直接再利用できます。大規模なシーンの読み込みラグを回避するために、フレーミングの非同期事前構築テクノロジーを使用して、BLAS 構築タスクを複数のフレームに分散できます。
  • 動的モデル
    • スケルトン アニメーション ドリブン - スキン付き頂点データをコンピューティング シェーダーでフレームごとに並列に計算して新しい頂点バッファを生成し、対応する BLAS の増分更新をトリガーする必要があります。これにより、完全な再構築を回避してパフォーマンスを向上させることができます。
    • 剛体変換 - 移動/回転/ズーム変換のみが関係する場合は、BLAS を変更する必要はありません。TLAS でワールド変換行列を更新し、TLAS クイック更新プロセスをトリガーします。

定期的な再構成は、レイトレーシングの動的シーンでアクセラレーション構造の効率を維持するために不可欠です。動的オブジェクトが変形や大規模な頂点の移動など、ジオメトリ トポロジで大幅な変更を受けると、元の空間分割が失敗し、レイ トラバーサル中の衝突検出のパフォーマンスが低下する可能性があります。その結果、非常に動的である BLAS/TLAS の増分更新ではなく、完全な再構築を N フレームごとにトリガーする必要があります。

最後に、レイトレーシング レンダリングのパフォーマンスを最適化するために、キャラクターの可視領域に基づく動的 TLAS 構築戦略を採用します。キャラクターの有効半径しきい値内のモデルのみが TLAS に含まれるため、レイの交差計算のコア オーバーヘッドを削減できます。

レイトレーシングによる反射

レイトレーシングによる反射には、画面空間反射(SSR)や平面反射(シーンを 1 次元に投影する単純なサーフェス)などの従来の手法に比べていくつかの利点があります。レイトレース リフレクションでは、光のパスが物理的にシミュレートされ、シーンの内外の動的なオブジェクトが正確にキャプチャされます。また、曲面や非平面のサーフェスからの自然な反射がサポートされ、鏡などの複数の光反射効果が有効になります。一方、SSR は画面に表示される情報に限定され、複雑なシーンでは平面反射によって視覚的なエラーや歪みが生じやすくなります。

図 3. プールに映る羽の反射。
図 4. モンスターの反射。

レイトレーシングによる反射は、原理的には従来の SSR に似ています。レイトレーシングによる反射は、視線の反射方向にピクセル単位でレイを放射し、レイとシーン オブジェクトとの交差を計算します。Ray Query API から返される交差点には、三角形レベルの幾何学的情報(インスタンス ID、ジオメトリ インデックス、プリミティブ インデックスなど)とラスタ化パラメータ(重心座標)が含まれますが、ピクセル色データは含まれません。一般的なソリューションでは、バインディング不要のリソース バインディング テクノロジーを使用して、シーンのすべてのテクスチャとマテリアル パラメータをグローバル インデックス アレイに事前コンパイルします。レイクエリから返された幾何学的識別子を使用して、対応するマテリアルの物理的特性(法線マップや粗さなど)を検索し、重心座標補間と組み合わせてサーフェス シェーディング情報を計算し、交差点の実際の色値をラスタライズによって再構築できます。

ただし、実装の過程で、Diablo Immortal チームは 2 つの重大な技術的な問題を発見しました。

  1. 照明モデルは統一を余儀なくされ、プロジェクトの歴史の中で蓄積されたさまざまなシェーディング システムと競合し、スペキュラ マテリアルと元のマテリアルの不一致が生じます。
  2. さまざまな頂点形式が使用されると、ラスタライズ ステージで命令分岐の効率が低下します。これは、モバイル デバイスの厳しいパフォーマンス バジェットでは大きな問題となります。

Diablo Immortal チームは、ジオメトリ処理とシェーディング計算を分離するために、可視性バッファを革新的に導入しました。

  • レイトレース フェーズ - ピクセルレベルのレイヒット情報が、レイクエリを介してリアルタイムでキャプチャされます。交差点の 3D 空間識別子(InstanceIDPrimitiveIndex)は、コンパクトな可視性 ID にエンコードされ、画面空間バッファに書き込まれます。
  • カラーリング ステージ - 頂点シェーダーとピクセル シェーダーによって実行されるオペレーションと同様に、可視性バッファ内のジオメトリ識別子が動的に解析され、元のモデルの頂点プロパティ(UV や法線など)と物理ベースのマテリアル マップがフェッチされ、最後にマテリアル タイプに関連するシェーディング計算が実行されます。

このソリューションにより、頂点形式やシェーダーを変更しなくても、アートアセットをレイトレース リフレクション システムに接続できます。

レンダリングの具体的な手順

レイクエリパス

レイ トレース ステージに対応し、スクリーン空間反射の可視性バッファを生成します。

  • Color0
    • 形式: R32G32UInt
    • R = TriangleID、G = 重心座標
図 5. 可視性バッファ。
  • 奥行き:
    • 形式: Depth32F
    • D = EncodeAsFloat(InstanceIdx, GeometryIdx)
    • 交差点のマテリアル ID は 32 ビット浮動小数点数でエンコードされ、マテリアルの深度符号化一致検出手法の次のステージのために深度バッファに書き込まれます。
図 6. エンコードされた深さ。

コンピューティング シェーダーと比較して、ピクセル シェーダーのレイヤクエリには次の利点があります。

  • パイプラインの統合 - パイプラインは既存のフォワード レンダリング パイプラインまたはディフェーア レンダリング パイプラインに直接埋め込まれ、レンダリング パイプラインの状態の連続性が維持されます。
  • モバイル帯域幅の最適化 - モバイルのタイルベースのアーキテクチャでは、レイヒット データが RenderTarget に書き込まれたときにオンチップの可逆圧縮をトリガーできるため、従来のコンピューティング シェーダーの出力からバッファへのメモリ帯域幅の消費量を削減できます。
  • レイ数の制御 - 反射しない領域は、ステンシル テストと組み合わせた事前計算フェーズでマークされ、拒否されます。

パスを解決する

着色ステージ(レイトレースによる反射を参照)では、Diablo Immortal チームは、深度テスト ハードウェア ユニットを使用して、連続バッチでマテリアルの着色を実行することで、迅速な識別マッチングを実現しました。

マテリアルごとに、全画面描画パスが発行されます。頂点シェーダーは、現在のマテリアルのエンコードされた識別子を動的に再構築します。深度等価テストを使用して、識別子が深度バッファ内のエンコード値と比較され、エンコード値が完全に一致するピクセル(現在のマテリアル インスタンスに属するピクセル)のみが保持されます。保持されたピクセルは、対応するマテリアル シェーダーを実行します。

次に、ピクセル シェーダーに高精度の素材再現が実装されます。

  • ジオメトリデータのデコード - 可視性バッファから三角形 ID(MeshID + PrimitiveID)と重心座標を抽出し、対応する三角形の頂点属性(位置、UV、法線など)を頂点バッファから動的に読み込みます。各モデルは独立したマテリアルとしてシェーディングされるため、バインディングなどの高度な機能は必要ありません。
  • サーフェス パラメータの再構成 - 重心座標補間を使用して、交差点の UV 座標を計算します。ソフトウェア ラスタライズが実行され、補間された UV に基づいてマップがサンプリングされます。
  • シェーディング計算の再利用 - 既存のシェーダー コードを直接再利用して、メイン レンダリング パイプラインと同じマテリアル ロジックを維持します。
図 7. 反射を解決。

最後に、反射計算に実際に参加するモデルは、シーンのごく一部にすぎません。GPU から返された反射モデル識別データを非同期で読み取ることで、反射に参加しないモデルやマテリアルを除外し、シェーディング ステージでの描画呼び出し数を効果的に減らすことができます(描画呼び出しは、マテリアルとメッシュが描画のために GPU に送信されたときに発生します)。

物理ベースの鏡面反射

高忠実度の反射を実現するため、反射面は粗さに応じて次の 3 つのタイプに分類されます。

  1. 反射なし - これらのサーフェスの反射計算をスキップしてリソースを節約できます。表面が非常に粗い場合、反射がぼやけて薄くなるため、寄与は明らかではありません。
  2. 鏡面反射 - 滑らかな鏡のように、反射した画像は鮮明でぼやけていません。視線から反射の方向に線を直接撮影します。
  3. 光沢のある反射 - 表面の粗さが一定の反射は、GGX 重要度サンプリングに基づいてシミュレートされます。これにより、計算効率と物理的な精度の両方を考慮できます。線を放射するときに反射が鏡面反射の主方向にずれるため、ハイライト領域のサンプリング効率が向上します。

消費電力を抑えながら使用可能な画質を実現するため、Diablo Immortal チームは 1SPP+Denoiser ソリューションを採用しました。つまり、Diablo Immortal チームはピクセルごとに 1 つのサンプルを取得し、時間的/空間的なノイズ低減アルゴリズムを使用して、低いサンプリング レートによって発生する大量のノイズを滑らかにしました。

Diablo Immortal チームは、AMD FidelityFX Denoiser の反射デノイズを選択しました。これは、レイトレーシング反射と画面空間反射用に最適化された高性能デノイズです。反射ノイズ除去ツールのコアとなる利点は、ノイズ除去ツールの空間時間ハイブリッド ノイズ低減アルゴリズムです。反射ノイズ除去ツールは、現在のフレームと過去のフレームデータを(モーション補正に基づいて)融合し、空間フィルタリング手法(分散ガイド付きエッジ保持フィルタリングなど)と組み合わせることで、ノイズを効率的に除去し、非常に低いサンプリングで滑らかな反射効果を出力します。

自社開発のレンダリング パイプラインの特性に適応し、モバイルの厳しいパフォーマンス制約を満たすため、Diablo Immortal チームは AMD FidelityFX Reflection Denoiser を統合する際に、ターゲットを絞った合理化とアーキテクチャの適応を実装しました。

Vulkan による高忠実度のレイトレーシング

Diablo Immortal は、Vulkan 対応のさまざまな Android デバイスで動作します。Diablo Immortal チームは、革新的な GPU ハードウェア レイトレーシング機能を活用しています。Vulkan により開発のオーバーヘッドと摩擦が軽減され、Android ユーザーに高品質の Diablo Immortal のコンテンツとゲームプレイを簡単に提供できるようになりました。

Vulkan でのレイトレーシングを使ってみる

Diablo Immortal で実証されているように、Android でレイトレーシング エフェクトを実現するには、対応するハードウェアで Vulkan API を活用する必要があります。Vulkan を直接使用することに関心があるデベロッパーは、ARMAndroid で Vulkan によるレイトレーシングについてまたは Qualcomm の Adreno GPU on Mobile: Best Practices の レイトレーシング セクションをご覧ください。API の詳細については、Khronos の公式の Vulkan でのレイ トレースの仕様をご覧ください。

エンジンベースの開発では、Unreal Engine が ARM と連携して、モバイルでのハードウェア レイトレーシングを使用した Lumen の試験運用版サポートを提供しています。Android でのハードウェア レイトレーシングの Unity サポートはまだ進化中です。Unity の最新情報をご確認ください。