超雑訳 Scaling Probe-Based Real-Time Dynamic Global Illumination for Production

こんねね、Pocolです。
今日は…
[Majercik 2021] Zander Majercik, Adam Marrs, Josef Spjut, Morgan McGuire, “Sacling Probe-Based Real-Time Dynamic Global Illumination for Production”, Journal of Compute Graphics Techniques Vol.10, No.2, 2021.
を読んでみようと思います。
いつもながら誤字・誤訳があるかと思いますので,ご指摘頂ける場合は正しい翻訳と共に指摘していただけると有難いです。


※図は,[Majercik 2021]より引用

Abstract

我々は、可視性を持つプローブベースの放射照度[Majercik et al 2019][McGuire et al 2017]のいくつかの実用的な拡張に貢献し、画質、定数および漸近的性能、メモリ効率、およびアーティスト制御を改善します。我々は、NVIDIA RTXGI SDK、UnityとUnreal Engine 4ゲームエンジン、およびいくつかの商用ゲームのための独自のエンジンのグローバルイルミネーションソリューションに以前の仕事を組み込む過程で、これらの拡張機能を開発しました。これらの拡張機能には、直感的なチューニングパラメータ(「セルフシャドウ」バイアス)、グローバルイルミネーションの遷移を高速化するヒューリスティック、再帰的なグロッシー反射のための再利用または放射照度データのプレフィルタリングラディアンス、最終的な画像に影響を与えない作業をプルーニングするプローブステートマシン、大規模な世界のためのマルチ解像度カスケードボリュームなどがあります。

1. Introduction

本稿では、グローバルイルミネーションの評価を高速化するアルゴリズムについて述べます。高速化は2つの部分からなる。メインは、\(irradiance(location, orientation)(E(X, \omega))\)という形式のクエリを可能にするデータ構造を作成し維持することで、拡散グローバルイルミネーションの潜在的に高価な計算を、空間上の任意の位置に対するデータ構造への\(O(1)\)ルックアップに置き換えます。第2部では、そのデータ構造を再利用して、入射放射輝度の重み付き平均をグロッシーグローバルイルミネーション(\(\int_{\Gamma}L(X, \omega) \cdot W(X, \omega) d\omega\))についてサンプリングし、その結果をフィルタリングされたスクリーン空間と幾何学的なグロッシーレイトレーシングと組み合わせます。
 この方法の拡散部分の旧バージョンを改良します[Majercik et al. 2019]。この改良は、Unityゲームエンジン、Unreal Engine 4ゲームエンジン、NVIDIA RTXGI SDK、およびいくつかの未発表の商用ゲームを含む、いくつかの製品にそのアルゴリズムを組み込む際に学んだことを統合したものです。これらの改良点には、品質とパフォーマンスを向上させるための基本的なアルゴリズムの変更、アルゴリズムとコンテンツのチューニングに関するアドバイス、グロッシー反射も高速化する完全なソリューションへのアルゴリズムの拡張、これらの手法のシステム組み込みのベストプラクティスなどが含まれます。これは、さまざまなプラットフォームからの制約、ゲーム開発者やゲームアーティストからの要望、およびこの問題に関する新たな研究によって推進されました。これらの改良は、異なるベンダーの複数の異なる製品化の取り組みにまたがって開発されたため、かなり普遍的で堅牢であると信じていますが、特定の1つの機能や性能を説明するものとして構築されるべきではありません。
 我々のアルゴリズムの重要な要素は、ある地点の方向情報を保存するプローブです。環境マップはプローブの一種であり、シーン内の任意の点から見た遠方の放射輝度を保存します。我々のプローブは、シーン内の点の3Dグリッド状構造について、放射照度、距離の加重平均、距離の二乗の加重平均を記憶します。プローブに関する項は表1を参照してください。

※表は,[Majercik 2021]より引用

 このアルゴリズムは、プローブの構成、計算、問い合わせに関連するいくつかの構成要素を持ちます。この論文で説明されている新しい情報を表2に示します。ここでは、このアルゴリズムの以前のバージョンの説明と比較して何が新しいかを示します。次のセクションでは、読者がアルゴリズムを理解するために以前のバージョンの説明を参照する必要がないように、アルゴリズム全体について完全に説明します。

※表は,[Majercik 2021]より引用

2. Overview of the Algorithm

アルゴリズムの核となるのは、色、距離、距離の2乗の加重和を保存するプローブです。最も近い物体までの距離の加重平均を記憶するプローブの2Dバージョンを図2に示します。このプローブは円の太いセグメントとして1つの「セル」(テクセル)を示しています。太い矢印はセルに関連する方向です。セルには各サンプル方向のヒット距離の加重平均が格納されます。この加重平均には、中央のセルの「外側」の方向も含まれることに注意してください。重み付け関数はセル中心に近い方向ほど大きくなり、その結果得られる加重平均は、 この特定の例では長い方向の影響をより強く受けることになります。太い点線は複数のセルに渡って保存された平均「距離」を表します。方向は複数のセルに寄与することができ、方向が寄与するセルを更新するために方向をループすることに注意してください。

※図は,[Majercik 2021]より引用

2.1. Build and Initialization

3Dグリッドを作ることから始めます。そのグリッドから、プローブの位置を静的ジオメトリの外側に移動させて最適化します(セクション5)。次に、すべてのプローブを “Off”、”Sleeping”、”Newly Awake”、”Newly Vigilant”、”Awake”、または”Vigilant に分類します(セクション6)。このステージが終了すると、すべてのプローブは最終的な位置と初期状態になります。

2.2. Probe Query

3D点(プローブボリューム内)と法線方向を取ります。ボリューム内の各点に対して、それを囲む8つのプローブ(3Dボックスの角)があります。その8つのプローブをループします。それぞれのプローブについて、以下の組み合わせからプローブの重みを計算します。

  • プローブの位置からのトライリニアウェイト
  • バックフェースウェイト(は、法線に対して点の後方にあるプローブか?)
  • 可視性の評価(はこの点でプローブが見ることが可能か?)。これはロバストなオクルージョンクエリのための”セルフシャドウバイアス”項を含みます(セクション4.1)。

各プローブから法線方向の値を読み取り、計算されたウェイトを使ってそれらを合計します。
 複数のボリュームを使用する場合は、各ボリュームに対してこの操作を行い、セクション7.4の説明に従ってボリューム間でウェイトを調整します。トラッキングウィンドウを使用したボリュームのブレンドについてはセクション7.3で説明します。

2.3. Probe Update

各プローブが “Awake “または “Vigilant”(セクション6)である場合、球状のフィボナッチパターンでレイをトレースし、[Marques et al 2013]はフレームごとにパターンをランダムに回転させます。プローブからの放射照度を含むようにプローブボリュームをサンプリングすることを含め,通常のディファードシェーディングアルゴリズムを使用して,これらのレイヒットをシェーディングします。その後、放射照度と平均距離値の両方について、以下のように更新を進めます。

Irradiance.
各プローブテクセルの方向に対するこれらのシェードされるレイヒットの放射輝度値の余弦加重平均を計算します。次に、各プローブテクセルについて、これらの新しく計算された値を\((1-\alpha)\)の割合でプローブテクセルにブレンドします。このヒステリシスは、セクション4.3で説明する収束のためのヒューリスティックに基づいて、プローブごと、テクセルごとに調整します。

Mean Distance and Mean Distance-Squared.
各プローブテクセルの方向に対する各レイの距離値の指数コサイン加重平均を計算します。各プローブテクセルについて、上記の放射照度と同様にこれらの値をブレンドします。ヒステリシスの調整は、放射照度とは別に行います – 詳細はセクション4.3で説明します。
 放射照度の更新と同様に、新しいシェーディング結果を\(1-\alpha\)の割合でアルファブレンドすることによってプローブテクセルを更新します。放射照度の更新式は以下の通りです:

\begin{eqnarray}
E'[n] = \alpha E[n] + (1 – \alpha) \sum_{{\rm ProbeRays}} {\rm max}(0, n \cdot w) \cdot L(\omega), \tag{1}
\end{eqnarray}

ここで、\(E\)は方向\(n\)の古い放射照度/可視性テクセル、\(E’\)は新しいテクセル値、\(\omega\)はレイの方向、\(L(\omega)\)はレイに沿って輸送される放射照度です。平均距離/距離二乗の重みの更新式は、式(1)のクランプされたコサインとは対照的に、指数コサインで示されますが、それ以外は同じです。

3. Related Work

インタラクティブグローバルイルミネーションは、何年も前から活発に研究されている分野です。本稿では、我々の研究に最も関連性の高い分野について概説します。

Interactive Global Illumination with Light Probes.
イメージベースドライティングソリューションは、現代のビデオゲームでは至る所にあります[Martin and Einarsson 2010; Ritschel et al 2009; McAuley 2012; Hooker 2016]。このようなソリューションの一般的なワークフローでは、ライトプローブをシーンのボリューム内に高密度に配置し、それぞれが何らかの形で球面ラディアンスマップ(イラディアンスマップ)をエンコードします。これらのマップの事前フィルタリングされたバージョンは,ディフューズとグロッシーなランタイムシェーディングクエリを加速するために保存することもできます。
 従来のライトプローブのバリエーションでは、アーティストが手動でボックスや球体のプロキシをシーンに配置することができます。これらのプロキシは、空間的に局所的な反射の変化をよりよく近似する方法で、実行時にプローブクエリをワープさせるために使用されます[Lagarde and Zanuttini 2012]。同様に、手動で配置された凸型プロキシ形状セットも、プローブベースの手法によく見られるライトリークのアーティファクトを低減するために、実行時に多数のライトプローブ間でクエリおよび補間する際のブレンドの重みを束縛するために使用されます。
 手作業によるプローブとプロキシの配置を排除することは、プロダクションにおける重要な未解決の問題であることに、実行者は同意しています[Hooker 2016]。従来のプローブを手動で調整しなければ、ライトリークやダークリークやずれた反射のアーティファクトにつながるプローブの配置を自動的に避けることは不可能です。Majercikら[2019]のライトプローブは、レイトレースされた視認性情報によってライトリークとダークリークを回避していますが、これらのプローブを均一なグリッドに配置すると、依然として最適ではないプローブ位置(例えば、プローブが壁にはまり込むなど)が生じます。グロッシーGIのためにこれらの問題を回避するために、いくつかのエンジンは、ピクセル精度の反射のために、代わりにスクリーン空間のレイトレーシング[Valient 2013]に依存しています。しかし、これらの方法は、反射オブジェクトがカメラの視点から見えないときに失敗し、一貫性のないライティングとビュー依存の(したがって、時間的に不安定な)反射効果につながります。
 ライトフィールドプローブ[McGuire et al. 2017]、シーンのジオメトリに関する追加情報を球形プローブにエンコードすることで、(静的ジオメトリと照明を持つシーンにおける)多くのライトリークとダークリークの問題を自動的に解決します。動的ライティングのソリューションはSilvennoinenら[2017]で紹介されていますが、このソリューションは粗い動的オクルーダーにしか対応しておらず、静的ジオメトリに基づく複雑なプローブ配置が必要です。上述したように、Majercikら[2019]の放射照度プローブは、動的な照明とジオメトリを持つシーンでほとんどのライトリークとダークリークを回避しますが、プローブの配置はまだ最適ではありません。最適でない配置は、信憑性はあるものの、正しくサンプリングされた結果よりも劣るライティング結果につながる可能性があり、鋭角でシャドウリークを示すこともあります。
Interactive Ray Tracing and Shading.
プローブベースのライティング手法による正しいシェーディングは、point-to-pointの可視性クエリに依存しています。高いレベルでは、我々のレイトレーシング技術は、(ボクセルのコーントレーシングのように)シーンのボクセル化された表現に対してレイをトレースすると解釈することができますが、オクツリーの代わりに球面ボクセル化を使用します。我々の表現の実用的な利点の多くに貢献する2つの重要な違いは、(1)ローカルおよびグローバルな可視性の詳細を解決するために暗黙のオクトリー構造に依存する代わりに、幾何学的なシーン情報(すなわち、半径方向の深さと深さの2乗)を明示的にエンコードすること、および(2)我々の空間パラメータ化もフィルタリングもシーン幾何学に依存しないことです。これにより、ライトリークとダークリークのアーティファクトを防ぎ、メートルスケールで動作するボクセルコーントレーサーとほぼ同じコスト(空間と時間)で、センチメートルスケールのジオメトリを解決することができます。我々は、単なるスクリーン空間レイトレーシングではなく、ピクセルシェーダにおける真のワールド空間レイトレーシングをターゲットとしているため、我々の技術は、多くの以前の、例えば、リアルタイム環境マップモンテカルロ積分法[Stachowiak and Uludag 2015; Wyman 2005; Toth et al. 2015; Jendersie et al. 2016]の一般化とみなすことができます。

Probe Representation.
Majercikら[2019]による研究と同様に,我々は球から単位正方形へのCigolleら[2014]の八面体マッピングを適用して,球面分布を保存しクエリします。このパラメータ化は,立方体マップよりもわずかに歪みが少なく,継ぎ目を管理するためのより簡単な方法を提供します。この研究では、品質と性能のために、八面体の放射照度と平均距離/距離の二乗の解像度を選択します。

GI in Production: A Motivating Example.
オフラインレンダリングとリアルタイムレンダリングの両方において、既存のグローバルイルミネーションアルゴリズムをプロダクション用に適合させることに、これまでの多くの研究が費やされてきました。映画産業におけるパストレーシングは、アーティストのワークフローとレンダーファームの計算負荷を根本的に変えました。コアとなるパストレーシングアルゴリズムはほとんど変わっていませんが,特定のハードウェアとソフトウェアシステムの実用的な考慮により,技術に特化したアップデートが必要でした[Keller et al. 2015]。
 同様に、以前に発表されたDDGIアルゴリズムに対する我々の拡張は、そのアルゴリズムや他のプローブベースの技術を本番環境に適応させるためのガイドとなります。本番環境の制約に適合させるために、基本アルゴリズムに加えた実際の変更を報告します。

4. Qualitative Image Improvements

4.1. Self-shadow Bias for Correct Visibility

サーフェイスでプローブボリュームをクエリする場合、可視性推定値の分散は分布の平均付近、言い換えればサーフェイスで最も大きくなります。この結果生じるシャドウリークを回避するために、プローブのクエリ時に、分布の平均から離れるバイアスがサンプルポイントに追加されます。以前の技術[2019]では、分布の平均、分布の分散、およびチェビシェフ統計検定のシーンチューニングされたバイアスの組み合わせを使用して、分布の分散の低いポイントにビジビリティクエリを移動しました。直感的には、「分布の分散の低い点」とは、(ワールド空間において)サーフェイスからわずかにオフセットした点と考えることができます。この洞察に基づき、これらの統計的バイアスパラメータを単一のセルフシャドウバイアス項に統一します。セルフシャドウバイアスは、サーフェイス上の最初の標本点から離れた方向を指すワールド空間ベクトルで、次のように計算されます:

\begin{eqnarray}
{\rm BiasVector} &=& ({\mathbf n} * 0.2 + \omega_o * 0.8) \\
& & * (0.75 * {\rm minDistanceBetweenProbes}) * {\rm TunableShadowBias} \tag{2}
\end{eqnarray}

ここで、\({\mathbb n}\)はサンプル点の法線ベクトル、\(\omega_o\)はサンプル点からカメラへの方向、0.2と0.8は経験的に決定された定数、minDistanceBetweenProbesはプローブ間の最小軸方向距離、TunableShadowBiasはユーザーが調整可能なパラメータ(デフォルト値は0.3)です。このバイアスベクトルを初期サンプルポイントに追加することで、ビジビリティテストに使用する新しいポイントが得られます。
 通常、セルフシャドウバイアスは以前のバイアスよりも堅牢です。TunableShadowBiasの既定値はほとんどのシーンで適切に機能しますが、以前のバイアスの組み合わせはシーンごとに個別に調整する必要がありました。シーン固有の調整が必要な場合、セルフシャドウバイアスは調整可能なパラメータが3つではなく1つであるため、調整が容易です。一般に、より低いレイカウントがプローブを更新するために使用される場合 (これは、パフォーマンスを向上させるために行われる場合がある) のように、深度推定の分散が増加する場合は、より高いセルフシャドウバイアスが必要です。
 さらにライトリークを減らすために、背面に当たるプローブ更新レイは放射照度の値を0として記録し、深度値を80%短くします。深度値を短くすると、プローブは背面サーフェスをシャドウとして認識し、ライティングしません。放射照度を0に設定して、プローブからの照明によってライトが漏れないようにします。次の2つの理由から、深度値を0に設定しません:(1) 計算されたチェビシェフウェイトを0に近づけてしまい、重みが正規化されたときに高くなる可能性があります。また、(2) (モデリングの特異性のために) 壁に刺さっていない背面を検出するプローブの平均深度が過度に歪められている可能性があります。壁に刺さったプローブの数をできるだけ少なくするために、セクション5で説明したように、反復調整アルゴリズムを使用してプローブ位置をオフセットします。

※図は,[Majercik 2021]より引用

4.2. Perception-based Exponential Encoding

放射照度プローブの収束が遅いと、シーンの急激なライティング変化により、拡散間接照明に顕著な遅れが生じることがあります。この遅れは、明から暗への遷移で顕著になります。これに対処するため、知覚に基づく指数ガンマ符号化をプローブ照度値に適用することで、収束を早めます。このエンコーディングは、明るさの直線的な低下として知覚的に補間します。指数5.0が最良の結果をもたらすことを実験的に決定しました(これより低いと収束が遅く、これより高くても収束は速くならない)。擬似コードについてはリスト1と2を、結果についてはhttps://jcgt.org/published/0010/02/01/で入手可能なビデオサプリメントをご覧ください。
 この知覚に基づくエンコーディングは、ファイヤーフライによる低周波フリッカー(更新レイが小さな明るいイラディアンスソースに当たることによって生じる、拡散GIにおける白熱閃光)を低減する効果もあります。

※リストは,[Majercik 2021]より引用

※リストは,[Majercik 2021]より引用

4.3. Fast Convergence Heuristics

さらに、イラディアンスデータに対するピクセルごとの閾値処理に基づく新しいヒューリスティックにより、収束を加速させます。我々の低い閾値は、最大値の25%以上の大きさの変化を検出し、ヒステリシスを0.15下げます。この場合、プローブがサンプリングしている分布が完全に変化したと仮定します。これらの閾値は放射照度の更新にのみ有効で、ビジビリティの更新時には不安定すぎることがわかりました。
 また、ライティングやジオメトリの変化に基づいてヒステリシスを調整する、シーン依存のプローブごとのヒューリスティックも実装しています(リスト3を参照)。これらは以下の通りです:

  • 小さなライティングの変化(例えば、プレイヤーが持っている懐中電灯が点灯する):4フレームの間、照度ヒステリシスを15%減少させる;
  • 大きなライティングの変化(例えば、急激な時間帯の変化):イラディアンスヒステリシスを10フレーム50%減少させる;
  • 大きなオブジェクトの変化(天井の陥没など):イラディアンスヒステリシスを10フレームで50%、可視性のヒステリシスを7フレームで50%減らす。

 すべてのヒューリスティックにおいて、最も安定した結果を得るために、可能な限り視界更新のヒステリシスを低くしないようにしています。シーン依存の各ヒューリスティックスでは、すべてのプローブ(変化に局所的なプローブだけでなく)のヒステリシスを小さくします。
 プローブのヒステリシスをシーンに依存して、テクセルごと、プローブごとに調整するための効果的なヒューリスティックは数多く存在します。例えば、シーン内のすべてのプローブに対してではなく、ライティングやオブジェクトの変化の影響を受けるプローブに対してのみヒステリシスを小さくする方が、おそらく効果的でしょう。より具体的で感度の高いヒューリスティックを探求することは、今後の研究にとって実りある課題ですが、ここで紹介したヒューリスティックは、複数のエンジンにこの技術を統合した我々にとって、十分に機能しました。我々は、それらを適応せざるを得ないようなコンテンツに出くわしたことはありませんでしたが,我々の調査は網羅的なものではありませんでした。
 テンポラルアンチエイリアス(TAA)は独自のヒステリシスを適用するため、TAAが適用されている場合、我々の技術のベースヒステリシスはより低くなる可能性があることに注意してください。この場合、TAAのヒステリシスは、プローブのヒステリシスと同様に、シーンのヒューリスティックスに従って調整されるべきです。そうでなければ、ライティングやオブジェクトが劇的に変化した場合でも、収束に常に大きなコストがかかります。

※リストは,[Majercik 2021]より引用

4.4. Second-order Glossy

ハーフスクリーン解像度のウェイブフロントレイトレースでグロッシー反射を計算します。これらのシェーディングされたレイヒットは,ディファードシェーディングパスの間,間接放射輝度計算に統合される前に,サーフェイスラフネスとカメラからの距離に従ってブラーされます。これらのレイトレースされた反射は,スクリーン空間反射よりも現実的ですが,2次から\(n\)次までの反射のためのレイトレースは,ほとんどのシーンで実行不可能です。我々は,2次から\(n\)次のグロッシー反射をシェーディングするために,プローブでフィルタリングされた放射輝度データを再利用することによって反射を改善し,最小限のパフォーマンスオーバーヘッドでより良い画質をもたらします(図4参照)。

※図は,[Majercik 2021]より引用

 再帰的バウンスでサーフェイスを粗くする(またはBSDF評価を切り捨てる)ことでノイズを減らすことは、プロダクションパストレーシングでは一般的です[Fascione et al 2019]。二次反射のための放射照度プローブの再利用も同様の近似であり、ここではすでに利用可能なデータ構造を利用することでノイズを回避しています。しかし、プローブデータ構造は、反射率の正しい尺度である余弦加重放射輝度ではなく、半球上の余弦加重積分または放射輝度を格納することに注意してください。これら2つの量は\(2\pi\)のファクターで等価ですが、単位が異なります:放射照度\({\rm W}{\rm m}^{-2}\) vs. 放射照度\({\rm W}{\rm s}^{-1}{\rm m}^{-2}\)。

5. Probe-position Adjustment

プローブの可視性情報は、オクルードされたプローブからのライトリークとダークリークを防ぎますが、一部のプローブはシェーディングに寄与しないように完全にオクルードされたままにしておきます。我々は、有用なプローブの数を最大化し、良好なビューポイントを生成するために、静的なジオメトリの周囲でプローブを反復的にシフトする、シンプルで高速なオプティマイザを紹介します。初期化の際、我々のオプティマイザは、各プローブを、それが見ることができる最も近い裏面を通して調整し、次に、サーフェイスのビジビリティを最大にするために、近い正面からプローブをさらに調整します(図5参照)。動的なジオメトリの周囲でプローブを移動させると不安定になるため、プローブは移動させません。

※図は,[Majercik 2021]より引用

 動的なオブジェクトを正しくライティングするために、均一にサンプリングされたプローブは、そのサンプル位置での完全な放射照度フィールドの近似であるという事実を活用します。プローブが動的オブジェクトを通過する場合は、背面ヒューリスティック(セクション4.1の終わりに記述される)によってシャドウリークが防止されます。プローブが出現すると、収束ヒューリスティック(第セクション4.3)は、その値をすばやく収束します。均一にサンプリングされた放射照度フィールドの表現を維持したいという要望のために、我々はまた、安定性と移動形状へのオンザフライ一般化を犠牲にしてプローブ収束を早めるかもしれない重点サンプリングのようなより複雑なプローブサンプリング技術を実装しませんでした。これらの更新技術を詳細に調査することは、将来の研究にとって有望です。
 オプティマイザの目的は、最終的な画像に貢献できるプローブの数を増やすことです。しかし、以下のシナリオは、オプティマイザが、画質を向上させることなく計算量を追加することがあることを示しています。平らな壁を囲む8つのプローブケージを考えてみましょう。オプティマイザは、サーフェイス内の4つのプローブをサーフェイスの外側で調整すると、プローブがサーフェイスを「ダブルカバー」することがあります。これにより、プローブケージ全体がオンになり、サーフェイスをシェードし、画質に大きな影響を与えることなく、アクティブにトレースするプローブの数を増やす可能性があります(図6)。我々のテストシーンでは、このわずかな非効率性は、プローブの位置をグローバルに最適化するという付加的なメリットに見合うものでした。

※図は,[Majercik 2021]より引用

 リスト4にプローブ位置オプティマイザーのコードを示します。3Dグリッドのインデックス特性を維持するため、最適化中にプローブが(グリッド軸に対して)最小プローブ間隔の半分以上動くことはありません。

※リストは,[Majercik 2021]より引用

 プローブ位置オプティマイザは、プローブ状態の分類中に5回繰り返し実行され、これは、ほぼすべてのプローブがその位置に収束するのに十分な時間です。プローブが接線の裏面を(無限に)行ったり来たりするのを防ぐため、反復回数の上限を5回としています。
最良の位置最適化アルゴリズムを決定するためには、さらなる研究が必要であり、この分野の多くの研究が存在します(例えば、Wangら[2019]を参照)。我々のオプティマイザは複数のエンジンでうまく機能しましたが、ほぼ間違いなく最適ではありません。

6. Probe States

大きなオープンスペースがあるシーンでは、調整後であっても、均一な3Dグリッド内の多くのプローブは最終的な画像に寄与しません。このようなプローブからのトレースや更新を避けるために、ロバストなプローブステートのセットを導入し、同じ視覚的結果で性能を向上させます。我々のプローブステートは、更新すべきでないプローブと、更新すべきプローブを分離し、さらに、(シーンの初期化時、あるいは移動するボリュームを持つプローブを識別するための)中間ステートを追加し(セクション7.3参照)、それに応じてヒステリシスを調整します。ステートの完全なセットを図7に示し、以下のセクションで説明します。

※図は,[Majercik 2021]より引用

6.1. Deactivated Probes

上述したように、3Dグリッドインデックスによってプローブの移動に制約が課されるため、すべてのプローブを壁の外に移動させることは不可能です(一部のプローブはグリッド構造によって制約を受けすぎます)。そこで、静的なジオメトリ内に留まるプローブを特定し、それらを「オフ」(トレースも更新もしない)にします。オプティマイザは静的ジオメトリのみを考慮するため、動的ジオメトリの内部で偶然発生したプローブは影響を受けず、適切な場合に正しくオンになります。

6.2. Probe-update States

静的ジオメトリの外側にあるプローブも、すべてのフレームでシェーディングに使用されるわけではありません。プローブのprobeSpacing内にジオメトリがない場合、そのプローブの値は使用されません。これらのプローブを “Sleeping” に設定し、サーフェスがプローブをシェーディングに使用しようとするときにプローブを起こします。プローブは、サーフェスにシェーディングしているとき、またはシェーディングしようとしているときだけ、”Awake” にする必要があることに注意してください。プローブがサーフェイスを遮光していなければ、ライティングの変化やカメラの近接は問題になりません。プローブを “Sleeping” に設定する場合も同様です。カメラがプローブを見ることができない場合でも、プローブが拡散放射照度(2次から\(n\)次までの可視性)を伝播しているため、プローブがサーフェスをシェーディングしている場合は “Awake” に設定する必要があります。したがって、静的なジオメトリをシェーディングするプローブは “Vigilant”(常にトレースして更新する)でなければなりません。ジオメトリに近いプローブはGIを伝播するためにトレースする必要がありますが、カメラから遠い領域ではグリッドの解像度をそれほど細かくする必要はありません。

6.3. Full Probe-initialization Algorithm

プローブの位置とステートは4つのステップで計算されます(リスト5参照):

  • 初期化されていないすべてのプローブについて、最適なポジショニングと初期状態を決定するために、5フレーム分のレイをトレースします。このパスが終了すると、それまで初期化されていなかったすべてのプローブは”Newly Vigilant”、”Off”、または”Sleeping”になります。
  • すべてのダイナミックオブジェクトのAABBを、プローブグリッドセル+セルフシャドウバイアスで拡張し、保守的な推定を行います。ダイナミックオブジェクトの拡張された AABB 内のすべての”Sleeping”プローブを”Newly Awake”に設定します。
  • オプションとして、”Newly Vigilant”と “Newly Awake”のプローブに対して多数のレイをトレースし、ヒステリシスを0に設定して1フレーム内に収束させます。
  • “Vigilant” および “Awake” プローブからのレイをトレースし、その値をシーンの通常のヒステリシス値で更新します。このステップは、前のステップが省略された場合、”Newly Vigilant “および “Newly Awake “プローブ値を収束させるためにも使用できます。

 アルゴリズムの最初のステップは、静的なジオメトリのバウンディングボックスを使用することで、プローブを球面レイキャストからの距離とバックフェースの情報に頼るのではなく、それらのバウンディングボックスに対して直接調整できるため、大幅に高速化できます。どのプローブを “Off “に設定すべきかを正しく判断するには、レイトレーシングがまだ必要ですが、このアプローチにより、多くのプローブを即座に “Newly Vigilant” に分類することができます。

※リストは,[Majercik 2021]より引用

Participating median and probe states.
プローブデータ構造は、3Dイラディアンスフィールドをエンコードし、そのボリューム内の任意のポイントでクエリ可能です。従って、何もない空間の位置で照会して、関与媒質のグローバルイルミネーションを提供することができます。この場合、サーフェイスをシェーディングしていないプローブであっても、関与媒質内にある場合は「Awake」である必要があります。
 リスト5で説明するパスは毎フレーム実行される可能性がありますが、大半のフレームではプローブが初期化されていないため、最初のステップは実行されません。オプションの収束パスが省略された場合、ほとんどのフレームで最終更新ステップのみが実行されます。

7. Quantitative Performance Improvements

7.1. Probe Sleeping Performance

我々のプローブステートスキームを使ったプローブスリープは、平均30~50%の性能向上をもたらします(図8)。性能の向上(中央の列)に加え、同じ性能でプローブ1つあたりにキャストされるレイの増加も示しています。プローブあたりにより多くのレイをキャストすることで、新しいプローブ値がより安定し、グローバルヒステリシスが小さくなり、GIの収束が速くなります。

※図は,[Majercik 2021]より引用

7.2 Probe Update Shader Optimization

Majercikら[2019]のアプローチは、(更新パスでボーダーテクセルの処理を避けるために)ステンシルバッファを持つピクセルシェーダを使用してプローブテクセルを更新しました。ボーダーテクセルは、正しいバイリニア補間のために別のピクセルシェーダパスで更新されました。このアプローチは、アルファブレンディングの結果を得るためにグラフィックハードウェアを活用します。ですが、GPU コンピュートのベストプラクティスで最適化された汎用 GPU(GPGPU)コンピュートオペレーションを使用することで、より高速な更新を達成できます。以下にこのアプローチの背景と詳細を示します。
 最新のGPUアーキテクチャは、ユーザーが指定した計算グリッド寸法をカバーするためにスレッドグループをディスパッチします。グループ内のすべてのスレッドが同じコードを並列に実行するため、スレッドがコード内で異なる制御経路を取らないようにすること(コヒーレント実行)は、パフォーマンスにとって不可欠です。コヒーレント実行を保証することで、整数個のグループで構成されるスレッドブロックに注意深くインデックスを付けることで、ピクセルシェーダーアプローチと比較して、更新パスで3倍の性能向上を達成しました。さらに、新しいプローブテクセル値を計算するときにすべてのスレッドが並列に読み込めるように、シェーディングされたサンプルレイヒットを共有メモリバッファに格納します。 
これまでの研究で、プローブの解像度が画質と性能に及ぼす影響が示されています。我々は、帯域幅、メモリフットプリント、高速コンボリューション、効率的なインデックス計算、そして最も重要な、ターゲットハードウェアのピーク占有率を得るためのSIMD命令(GPU上のスレッドレーン)へのマッピングを組み合わせてプローブ解像度(8×8放射照度、16×16可視性)を選択しながら、画像品質を維持している。2の累乗で、プローブは32または64のスレッドグループ(一般的なハードウェアで定義された最小サイズ)で更新され、最大限の占有率とコヒーレンスを得ることができます。任意の分解能値は、効率を犠牲にして最高の柔軟性を提供します。
 図9は、正しいハードウェアバイリニア補間のためのボーダーテクセルコピーを説明するための八面体プローブエンコーディングの例を含む、我々のコンピュートシェーダーインデキシングの詳細を示しています。我々の最適化されたコンピュートシェーダは、補足資料において、以前の技術[2019]のアップデートシェーダと一緒に含まれています。

※図は,[Majercik 2021]より引用

7.3. Tracking Windows

概念的には、プローブグリッドはシーン内のすべての空間をカバーします。しかし、実際には、レベルサイズの高解像度プローブグリッドを更新してトレースするための計算やレイトレーシングのバジェットはありません。最も必要とされる場所で高いプローブ解像度を維持するために、プローブの3Dトラッキングウィンドウを実装します。我々はこのウィンドウをカメラの追跡に使用しましたが、どのような物体も同じ戦略で追跡することができます。我々のウィンドウはカメラを中心に始まります。カメラが移動するとき、もしカメラが中心から(どの軸にそってでも)ケージ内の2つのプローブ間の距離より遠くに移動すると、プローブの新しい平面が(その移動方向に対して)その前に生まれ、最も後ろにある平面は消えます。この動作は、3次元の固定長円形バッファを使って実装します。新しいプローブプレーンが現れて初期化されると、その新しい値がカメラの後方にある最後列のプレーンのメモリに書き込まれます。プローブはカメラの上を離散的なステップで「跳躍」します(図10)。プローブウィンドウが離散的にステップするため、複数のプローブボリューム間を注意深く補間する必要があります。

※図は,[Majercik 2021]より引用

7.4. Multiple Probe Volumes

解像度の異なる複数のプローブボリュームを使用することで、カメラからカスケード的に徐々にグリッド解像度を下げて効率的に実施できるため、画質に影響を与えることなくパフォーマンスを節約できる。同じアプローチは、geoclipmaps[Losasso and Hoppe 2004]、light-propagation volumes[Kaplanyan and Dachsbacher 2010]、voxel cone volumes[Crassin et al. 2011]です。 高解像度の拡散放射照度を必要とする複雑なジオメトリを持つアセットを効率的にカバーするために、高解像度のボリュームを追加することもできます。すべての更新レイを1つのテクスチャにパックすることで、1つのトレースで複数のボリュームを効率的に更新できます(図11参照)。

※図は,[Majercik 2021]より引用

 3Dグリッドの各軸に沿って、最後のグリッドセル(プローブの最後から2番目の平面から始まる)で1.0-0.0から線形減衰することによって、ボリューム間をブレンドしました(図12)。ディファードシェーダでは、各ボリュームに対して、密度が高いものから低いものへとウェイトが計算されます。最も密度の高いボリュームが、そのボリュームが含む点の局所的なライトフィールドを最もよく近似するので、密度の高い順にサンプリングします。ボリュームの重みは各ボリュームサンプルで累積されます。重みの合計が1.0に達すると、それ以上のボリュームはスキップされます。

※図は,[Majercik 2021]より引用

 上述した重み付けボリュームブレンドは、静的なボリュームに対してはスムーズなトランジションをもたらしますが、カメラロックされたボリュームに適用するとGIにポップが発生する可能性があります。プローブの平面がカメラの前でリープフロッグすると、いくつかのポイントは、スパースカスケードによって完全にシェーディングされた状態から、カメラカスケードによって大きくシェーディングされた状態になります(図13)。カメラロックされたボリュームのブレンディングウェイトを計算するとき、トランジション領域を(各軸に沿って)1グリッドセルずつ狭め、それをカメラの中心に置くことでこれに対処します。新しい平面がボリュームの前面に現れても、トランジション領域が狭くなっているため、そのボリュームの中に新しく入った点がすぐにシェーディングされることはありません。代わりに、それらの点は、カメラがそれらに向かって移動するにつれて、徐々にボリュームの間に移行します。結果は補足ビデオでご覧いただけます。

※図は,[Majercik 2021]より引用

プロトタイプのマルチボリュームコードは、すべてのプローブボリュームをディファードシェーダに渡し、ピクセルごとにそれらを反復処理して、シェーディングされる点を含むものを突き止めます。性能的に最適なアプローチではありませんが、これは画質を評価するためにブレンディングアルゴリズムを微調整する際に最も高い柔軟性を提供します。プロダクションの実装では,ディファードシェーディングのライトループの問題に対する通常のソリューション(ボリュームをライトとみなす)が利用可能です:

  • フルブルートフォースライトループを実行します – 10ボリューム未満の場合、どのボリュームにシェードされる点が含まれているかを判断するポイントインOBBテストは評価が速いです;
  • 各ボリュームの境界をラスタライズして、カバーされているピクセルを見つける;
  • ボリュームの空間データ構造(オクツリー、BVHなど)を作成し、ピクセルシェーダーで実行時にそれをトラバースして、ピクセルがどのボリュームにあるかを見つけます。この方法は、より多くのブックキーピングと、潜在的にコストのかかるデータ依存のフェッチを必要とします;
  • CPUまたはGPUパスでセットアップされたタイル[Olasson et al. 2012]を使用して、以前の方法のいずれかを保守的に近似します。

 純粋なカスケード法では、ボリュームはワールド空間で軸平行で、規則的なパターンで入れ子になっているため、これらの最適化は必要ありません。

7.5. Inline Shading

以前のプローブスキームでは、フレーム上の間接的な寄与を収集するために余分なシェーダパスが必要でした。我々は、シェーディング中にプローブデータ構造を直接サンプリングするために、グローバルイルミネーションギャザーステップを最適化する、よりシンプルなフレームワークを提示します。我々のコードは補足資料のGIRenderer_deferredShade.pixに含まれています。

8. Conclusion and Discussion

我々は、画像品質、性能、および生産設定における展開の容易さを改善するための動的拡散グローバル照明アルゴリズム[Majercik et al. 2019]に対する複数の拡張を提示しました。これらの拡張機能は、この手法をNVIDIA RTXGI SDK、Unityゲームエンジン、Unreal Engine 4ゲームエンジン、およびいくつかの商用ゲームに統合する際に発生する生産上の制約に対応するために開発されました。
 Majercikら[2019]の基本アルゴリズムは、その画質と性能により、本質的に実用的です。本論文は、実用的なアルゴリズムと制作環境に対して準備されたアルゴリズムとの間のギャップをカバーします。我々の「セルフシャドウバイアス」のような拡張は、アルゴリズムのチューニングを容易にし、更新パスのパフォーマンス最適化は、プロダクションゲームのレンダリング予算で実現可能にします。すべての拡張機能において、アルゴリズムを根本的に変更することなく、堅牢で理解しやすく、チューニングしやすいソリューションを求めました。

8.1. Limitations and Future Work

我々が提案する収束ヒューリスティックは、以前のアプローチよりも収束を向上させるものの、小さくて明るい光源(懐中電灯のような-7:05の補足ビデオ参照)に対しては、間接照明に若干のゴーストが残ります。このラグは、ゴーストの原因となることが知られている小さな光に対して、我々の特定のヒステリシス低減ヒューリスティックを強化することで対処することができますが、これをグローバルに行うと、画像の他の領域で不安定になる可能性があります。リフレクティブシャドウマップ[Dachsbacher and Stamminger 2005]のようなより専門的な手法ではゴーストが少なくなりますが、我々の手法の利点は、すべての光源を汎用的に扱ってグローバルイルミネーションを生成できることです。
 パフォーマンスの向上に加えて、フレームごとのレイバジェットを実装して、テクニックのレンダリングバジェットをより細かく制御できるようにすることもできます。我々のアプリケーションでは、(a) プローブあたりのレイと (b) ボリューム内のプローブ数を制御することで、性能目標を達成するのに十分であることがわかりました。レイバジェットのより洗練された処理は、プローブごとに異なるレイの量をトレースし、実装に多くの複雑さを追加します。我々は、より最適化されたレイバジェットよりも単純さを選択しましたが、プローブ間の最適レイ配分(ライティングやジオメトリの変更、カメラの位置などを考慮して、など)の研究は、興味深い将来の研究です。
 このアルゴリズムはレンダリング効果の広い空間をカバーし、将来の研究のための多くの可能な方向を示唆しました。例えば、我々の技術は、イラディアンス値を余弦フィルタ放射輝度として再利用するために、二次光沢反射を最大ラフネスに強制します。二次光沢反射は、可視性プローブの重みづけのように、異なる余弦指数重みづけを用いた複数の高解像度フィルタしたラディアンステクスチャを用いることにより改善できましたが、サンプルポイントごとに1つではなく複数の八面体表現を用いました。これらを使用して、さまざまなラフネスの2次光沢反射をレンダリングできます。

Acknowledgements

何よりも、Peter Shirley氏の貴重なフィードバックと編集に感謝します。Corey TaylorとMike Maraには、初期のプローブ実装に感謝します。オリジナルのDDGI論文で尽力してくれたDerek NowrouzezahraiとJean-Philippe Guertinに感謝します。Paul Hodgson、Peter Featherstone、Jesper Mortensen、Kuba Cupisz、その他Unityコペンハーゲンのライティングチームに感謝します。Kelsey BlantonとAlan WolfeのNVIDIAI RTXGI SDKの開発に感謝します。Ninja TheoryのPablo Palmier氏には、Unreal Engine 4に関して大変お世話になりました。

References



Index of Supplemental Materials

補足資料には、各拡張機能のビデオ結果が含まれています。関連するC++およびシェーダコードと同様に、http://jcgt.org/published/0010/02/01/supplemental.zipから入手できます。 必要に応じて、比較のためにMajerickらのコード[2019]を含めました。