[解説]Enlighten レイトレーシングの品質を底上げする技術(開発中間報告)
GamesIndustry の記事を翻訳いたしました(個人名は原文のままです)。
訳文の一番下にあるボタンからソースのページに移動できます。
Enlighten がビデオゲームのレイトレーシングにどのように取り組んでいるか
Silicon Studio は、Enlighten とリアルタイムレイトレーシングを統合した
グローバルイルミネーションアプローチについて詳しく説明しています
スポンサー記事 Thursday 1st October 2020
新世代のゲーム機の発売に注目しているなら、おそらくレイトレーシング(ray tracing = 光線追跡法)の話を聞いたことがあるでしょう。
レイトレーシングは、光の屈折と反射をシミュレートすることにより、写実的ななグラフィックスをレンダリングする手法です。言い換えれば、それはビデオゲームの中で光を現実的に振る舞わせます。光線をシミュレートし、光線が物理的な世界でたどる経路を追跡します。
このグラフィック技術(演算)は非常に印象的であり、GPU の改善により、現代のゲームで現実のものになりつつあります。
ただし、欠点があります。
開発者がレイトレーシングのみを使用する場合、高品質のグローバルイルミネーションを確保するには、多数の光線を投影する必要があります。ゲームには高度にインタラクティブな環境が必要であるという事実を考慮すると、最新のハイエンド GPU カードを使用している場合でも、十分な計算が難しい場合があります。
そこで私たちは、
- Enlighten ダイナミックライティング・テクノロジィ
- リアルタイム・レイトレーシング
を使用して、レイトレーシング効果を最大化しながらパフォーマンス(処理速度)を向上させるハイブリッド手法を開発することにより、フォトリアリスティックな画像をレンダリングする方法を研究してきました。
これはまだ開発中のプロジェクトであり、最終的な結果は異なり、パフォーマンスと結果が全体的に改善されると予想されます。
まずは、列車のヤードについて作成したデモから始めましょう。これは Unreal Engine 4(UE4)で構築されており(この手法は他のエンジンにも適用できます)、光源は単一の指向性ライトと単一の天窓からのみです。
Enlighten によるレイトレーシング反射
最初のテーマは、Enlighten を使用した反射のレイトレーシングです。
反射に関しては、間接光はレンダリング時に2つの部分に分けられます。拡散反射光と鏡面反射光です。拡散部分は視点に依存せず、カメラの動きとは関係がないため、どの角度から見ても同じ結果が得られます。
鏡面反射 / 反射は視点に依存し、反射の方向はカメラの方向に応じて変化します。この最初のテーマでは、鏡面反射 / 反射に焦点を当てています。
反射の最も一般的なアプローチは、UE4 では「リフレクションキャプチャ」と呼ばれる環境キューブマップです。
もう1つのアプローチは、「スクリーンスペースリフレクション」(SSR)です。
これはカメラアングルに依存しますが、画像内に反射が見られる場合、美しい結果をもたらす場合があります。これらの反射が表示されている画面の外側にある場合、アーティファクトが発生する可能性があります。
そして、レイトレーシング。
反射光線は表面から透過し、光線が領域に到達すると、そのマテリアルが計算され、結果が返されます。SSR のような制限はなく、反射がシーン全体を満たし、美しい結果をもたらします。
現在の実装では、Enlighten はリアルタイムアプローチで更新された環境キューブマップを採用しています。光の角度が変化する場合、キューブマップ上の直接 / 間接の光は、CPU によってリアルタイムで更新されます。
GPU 側では、CPU によって生成されたキューブマップをサンプリングするだけで済みます。Enlighten の全体的なコストは十分に小さいため、パフォーマンスに影響はありません。
レイトレーシング反射を使用すると、画面外のオブジェクトを含むシーン全体がリアルタイムで更新されます。高精度の結果が得られますが、光沢反射の場合は複数の光線を透過する必要があります。また、場合によっては2回目の反射を追加(計算)する必要があり、これらすべてがパフォーマンスに影響します。
私たちの目的は(主に4つで)、
- シーン全体をリアルタイムで更新し
- 「画面外のオブジェクト」を反射に含め
- レイトレーシング反射のおかげで高精度の結果を生成し
- Enlighten の間接照明と組み合わせてより現実的な結果を得て、Fallback(フォールバック) を追加する
ことです。
パフォーマンスヒットがレイトレーシングだけには高すぎる場所を(プログラムが)「啓発」します。
Fallback 機能を使用すると、粗さが特定のしきい値を超えた場合、または必要なバウンス(光の跳ね返り)の数がパフォーマンスに大きな影響を与えた場合に、ユーザは Enlighten のキューブマップを Fallback(最後の拠り所に)できます。
スクリーンショットを見てください。上のスクリーンショットは、Enlighten が追加された後の結果を示しています。下の画像は、Fallback to Enlighten 機能が導入された後の結果を示しています。右側のボールは粗さのしきい値を超えたため、Enlighten のキューブマップに置き換えられました。ボールの間の黒い部分は、2回目のバウンス(光の反射)が欠落していることを示しているため、Enlighten のキューブマップにも置き換えられています。この Fallback 機能は、光沢のある反射によって生成されるノイズを軽減できます。
つまり、送信する必要のある光線が少なくなり、(演算が複雑になりすぎず)パフォーマンスが向上します。
それでは、結果を見てみましょう。中央のボールは鏡面反射を示しています。間接照明がどのように更新されているかを確認できます。
Reflection Ball(2020/09/16)
さらに、右下のレールを見てください。粗さの値は、上のテクスチャが滑らかになり、下のテクスチャが粗くなるように変更されます。大まかな部分は、Enlighten キューブマップに Fallback します。レイトレーシングの結果と Enlighten キューブマップの結果はシームレスに変化しています。
Reflection Fallback(2020/09/16)
パフォーマンスに関しては、同じシーンを使用して、Enlighten を追加する前後のパフォーマンスを比較しました。
レイトレーシングの反射(の計算時間)は、
- Enlighten 導入前 1.72 ms(ミリ秒)
- Enlighten 導入後 1.87 ms
というように、計算コストの上昇がほとんどないため、Enlighten を追加するコストはかなり小さくなります。
Enlighten への Fallback 機能を使用すると、荒くなることが抑えられるため、パフォーマンスが大幅に向上します。
レイトレースされた Enlighten 可視性
実行時に、ゲームエンジンは、光源情報だけでなく、その光源に関するシャドウ情報も Enlighten に提供する必要があります。このシャドウ情報は、Enlighten の可視性と呼ばれます。
光源からの光漏れを防ぐには、適切な可視性データが必要です。これにより、Enlighten はより正確な間接照明を提供できます。
これらの可視性データを収集するために、Enlighten はシーン内のサンプリングポイントを事前に定義します(右の図を参照)。
現在の実装では、シャドウマップのサンプリングまたはレイキャスティングは、Enlighten の可視性データを生成する一般的な方法です。ハードウェアレイトレーシング機能を使用して、これらのデータを生成する新しい方法である「レイトレーシング Enlighten 可視性」を導入しています。
この方法では、サンプリングポイントから光源まで光線を追跡し、その間にあるオブジェクトと交差する場合は、可視性の値をゼロに設定します。つまり、光源の位置が変わったり、動く物体がシーンに干渉したりしても、可視性はリアルタイムで更新されます。
この方法には、すべてのタイプの光源をサポートするという利点があり、レイトレーシングをサポートするすべてのゲームエンジンに簡単に適合させることができます。
Enlighten Visibility(2020/09/16)
上のビデオでは、屋根の窓を閉じると間接照明がリアルタイムで暗くなることがわかります。トンネルに焦点を合わせると、直接光の量が減るにつれて、トンネルの内部に到達する間接照明が少なくなります。より暗くなっていくのが「明白」です。
パフォーマンス面では、透過光線のタイプはシャドウ光線のみに制限されるようになりました。光線の数は、可動ライトの数と、各ライトの影響を受けるサンプリングポイントの数によって決まります。
示したデモでは、シーン全体に影響を与える単一の指向性ライトのみが配置されています。これにより、40,000のサンプリングポイントが作成されました。つまり、40,000のシャドウレイがあり、GeForce RTX 2060 を使用すると、処理に0.04 msかかりました。
Enlighten を伴うレイトレーシングの Final Gather
最初のトピックでの鏡面反射 / 反射の後、拡散間接照明の計算方法を説明する価値があります。
この図には、スポットライトと灰色のボックスがあります。スポットライトは天井の一部を照らします、これは直接光です。疑問符(?)が残っている領域は黒のままですが、Enlighten の出番である間接光で照らされているはずです。
Enlighten は、最初の事前計算フェーズで、静的アクター(形状と位置が固定されたアクター)に関する最適化されたランタイムデータを生成します。実行時に、Enlighten はこれらのデータを入力として受け取り、エンジンによって提供される直接照明およびマテリアル情報とともに、無限の光の跳ね返りから間接照明を生成します。
結果は次のとおりです。
Enlighten(2020/09/16)
このセクションでは、特に拡散照明について説明しているので、これは照明のみの結果です。照明部分だけをレンダリングします。
Enlighten LightOnly(2020/09/16)
Enlighten を使用すると、指向性ライトと天窓からの間接ライトがリアルタイムで更新されます。ただし、青い列車が移動オブジェクトです。つまり、事前計算データではそれが考慮されないため、列車(の車体)から跳ね返った光はレンダリングされません。
次に、「Final Gather 照明機能」について説明します。
Final Gather は、レンダリングポイントから光線を送信し、それらが当たった場所の照明情報を要約します。最初の光の跳ね返りをシミュレートするだけなので、別のグローバルイルミネーションと組み合わせて使用されることがよくあります。
UE4 の Final Gather 実装では、光線は画面上のピクセルから送信されます。これらのピクセルからの光線が領域に到達すると、Gather Points がトリガーされます。
次に、シャドウレイが Gather Points から光源に送信されます。このプロセスは通常、パストレーシングでは「次のイベントの推定」と呼ばれます。光線をランダムに透過するのではなく、光源を直接透過するため、収束が速くなります。
次に、Gather Points によって照明を取得し、それらを Screen Pixels に要約します。その後、Screen Pixel の間接光の結果を取得できます。以下の結果を見ると、移動するオブジェクトから光が跳ね返っています。
FinalGather LightOnly(2020/09/16)
それでは、Enlighten の照明を UE4 の FinalGather と比較してみましょう。
Enlighten は無限のバウンス(光の跳ね返り)、安定した照明結果を持ち、GPU の負荷は重くありません。ただし、詳細はライトマップのピクセルサイズに基づいて制限されており、移動するオブジェクトでのバウンスはありません。
UE4 の Final Gather を使用すると、美しい最初のバウンスが得られ、移動するオブジェクトが跳ね返します。ただし、最初のバウンスのみで、ノイズが多くなります。
これらの利点と制限からわかるように、2つのアプローチは互いに補完し合っています。両方を組み合わせることで、Final Gather の美しい最初のバウンスと一緒に Enlighten の無限のバウンスを得ることができ、さらに光は動くオブジェクトから跳ね返るを得ることができます。
これを行うには、2つのアプローチがあります。
Enlighten の結果は、Screen Pixel または Gather Point で追加します。(以下の動画での説明を)簡単にするために、Gather Point での結果に焦点を合わせることにしました。これは、Enlighten の結果がもう一度バウンスされ、可動オブジェクトから2回目のバウンスを取得できることを意味します。Gather Point からより明るい照明結果が得られるため、ノイズが少なくなることが期待できます。
FinalGather Enlighten LightOnly(2020/09/27)
結果からわかるように、Enlighten の無限のバウンスにより、シーン全体が明るくなります。次に、下の画像の黄色い丸で囲まれた領域を見てください。
Unreal Engine 4 Final Gather の結果と比較して、2回目のバウンスとそれに続くものが追加されました。右側の赤レンガは跳ね返し、列車の右側と上側に赤みが塗られています。動く物体である電車からの跳ね返りも見ることができます。
次に、以下のスクリーンショットの比較を見てください。
以下の左の画像はパストレーシングの結果を参照として示しています。これをUnrealEngine 4 の Final Gather の結果と比較し、Enlighten の反射を追加すると、結果はパストレーシングの結果に非常に近くなります。Final Gather の結果と比較すると、ノイズは少なくなりますが、それでもなくなるわけではありません。
パフォーマンスに関しては、Final Gatherだけで、Create Gather Points パスに3.06 ms要しますが、Enlighten では3.58 msに上昇します。コストはここでも比較的重要ではありません。
これはすべてまだ進行中の作業(開発)であり、今後さらに公開する予定です。
Enlighten 3.12 公開以降、レイトレーシングされた Enlighten の可視性のサポート、およびレイトレーシングの反射と Enlighten の組み合わせが早期アクセスで提供されます。レイトレーシングのファイナルギャザーとエンライテンの組み合わせは、実験として提供されます。
Enlighten の詳細については、ここをクリックしてください。こちらの YouTube で最近の Enlighten チュートリアルビデオをチェックすることもできます。
補足 高度にインタラクティブな環境が必要
ゲームの場合、プレイヤの操作によりグラフィックの表示のされ方(ディスプレイに出力される画像)は異なります。よって、その都度計算(演算)が求められます。
映画は真逆です。全く同じ特定の場面を視聴するすべての人が目にします。
補足 Enlighten
「啓発する・教える」という意味の単語です。技術名ですが、造語ではありません。
単純にいうと、光線計算の「無駄を啓発」し、処理時間短縮してなお、美しい画像を保つことを目的としています。
補足 Fallback
直訳すると、「最後の拠り所、頼みの綱」です。
補足 アクター(actors)
この場合は、3次元空間内にある「オブジェクト」という認識で問題ないです。静的とあるので、基本的に動きません。
補足 Final Gather
gather は、 直訳すると「収穫物」。演算によって得られる「結果」(データ)という認識で問題ないです。
驚異の技術です。その「中身」が興味深いですね。
やっとご紹介できました^^;