Enlightenはゲームにおけるレイトレーシングにどのように取り組んでいるのか
広告記事:シリコンスタジオがEnlightenとリアルタイムレイトレーシングを統合したグローバルイルミネーションアプローチの詳細を発表した。
※本記事は英国版の広告記事だが興味深い内容のため日本版でも取り上げる
新世代のゲーム機の発売に注目している人なら,レイトレーシングの話を聞いたことがあるだろう。
レイトレーシングとは,光の屈折と反射をシミュレートすることで,フォトリアリスティックなグラフィックスを実現するレンダリング技術だ。言い換えれば,ビデオゲームの中で光を現実の生活の中と同じように振る舞わせる。これは,光線をシミュレートし,光のビームが物理的な世界で進む経路をトレースする手法だ。これにより非常に印象的な画像が得られるが,GPUの改善により,現代のゲームでは現実のものになりつつある。
しかし,欠点もある。デベロッパがレイトレーシングのみを使用する場合,高品質のグローバルイルミネーションを確保するためには,大量の光線を投影する必要がある。ゲームは高度なインタラクティブ環境を必要とするため,最新のハイエンドGPUカードを使用しても十分な計算が困難な場合があるのだ。
そこで我々の出番だ。我々は,Enlightenのダイナミックライティング技術(参考URL)とリアルタイムのレイトレーシングを使用してフォトリアリスティックな画像をレンダリングする方法を研究しており,レイトレーシング効果を最大化しながらパフォーマンスを向上させるハイブリッドな方法を開発している。
これはまだ開発中のプロジェクトであり,最終的にはパフォーマンスと結果が改善され,異なる結果が得られることを期待している。
まずは,鉄道の操車場のデモから始めよう。このデモは Unreal Engine 4 で作成した(このテクニックは他のエンジンにも適用できるが)。光源は,1つの指向性ライトと 1つのスカイライトのみだ。
最初のトピックは,Enlightenを使ったレイトレーシング反射についてだ。
反射という点では,間接照明はレンダリング時に2つの部分に分かれている。拡散部とスペキュラ/反射部だ。拡散部分はビューに依存せず,カメラの動きとは関係がないため,どの角度から見ても同じ結果が得られる。スペキュラ/反射はビューに依存しており,カメラの方向に応じて反射の方向が変わる。この最初のトピックでは,スペキュラ/反射に焦点を当てている。
反射の最も一般的なアプローチは環境キューブマップで,UE4ではReflection Captureと呼ばれている。
もう1つのアプローチは,スクリーン空間反射(SSR)だ。これは,カメラの角度に依存するが,画像内で反射が見られる場合,美しい結果をもたらすことができる。これらの反射が可視スクリーンの外にある場合はアーティファクトが発生する可能性がある。
そして,レイトレーシングがある。反射光線は表面から伝播し,光線がある領域に到達すると,そのマテリアルが計算されて結果が返される。SSRのような制限がなく,反射がシーン全体を埋め尽くし,美しい結果が得られる。
現在の実装では,リアルタイムで更新される環境キューブマップを採用している。光の角度が変化すると,キューブマップ上の直接光と間接光がCPUによってリアルタイムに更新される。GPU側ではCPUが生成したキューブマップをサンプルするだけで,Enlightenの全体的なコストは小さく,パフォーマンスに影響を与えない。
レイトレーシング反射では,画面外のオブジェクトも含めてシーン全体をリアルタイムで更新する。高精度な結果が得られるが,光沢反射の場合,複数の光線を送信する必要がある。また,場合によっては2回めのバウンスを追加する必要があり,パフォーマンスに影響を与える。
我々の目的は,シーン全体をリアルタイムで更新し,画面外のオブジェクトを反射に含め,レイトレーシング反射による高精度な結果を生成し,Enlightenの間接照明と組み合わせて,よりリアルな結果を得ること,そしてレイトレーシングだけではパフォーマンスのヒットが大きい場合にEnlightenにフォールバックする機能を追加することだ。
フォールバック機能により,ラフネスが特定の閾値を超えた場合や,必要なバウンス数がパフォーマンスに影響しすぎる場合には,ユーザーはEnlightenのキューブマップにフォールバックできる。上のスクリーンショットはEnlightenを追加したあとの結果だ。下のスクリーンショットは,Fallback to Enlighten機能が導入されたあとの結果を示している。右側のボールはラフネスの閾値を超えてしまったため,Enlightenのキューブマップに置き換えられた。ボールとボールの間の黒い部分は,セカンドバウンドがないことを示しているので,これもEnlightenのキューブマップに置き換えられている。このフォールバック機能は,光沢のある反射によって発生するノイズを軽減することができ,光線の使用量が少なくて済むため,パフォーマンスが向上する。
では,結果を見てみよう。中央のボールが鏡面反射をしている。間接照明がいかにアップデートされているかが分かる。
さらに,右下のレールを見てほしい。ラフネスの値を変更して,上のテクスチャが滑らかで下のテクスチャが粗くなるようにしている。ラフな部分はEnlighten cubemapsにフォールバックしている。レイトレーシングの結果とEnlighten cubemapの結果がシームレスに変化している。
パフォーマンス面では,同じシーンを使って,Enlightenを追加する前後のパフォーマンスを比較してみた。Enlightenを導入していない場合,レイトレーシングの反射は1.72msだが,Enlighten導入後は1.87msまでしか上昇しないので,Enlightenを追加するコストはかなり小さいと言える。Fallback to Enlighten機能を使えば,ラフネスの最大値が下がるにつれてパフォーマンスが大幅に向上する。
実行時には,ゲームエンジンは光源情報だけでなく,その光源に関する影の情報もEnlightenに提供する必要がある。この影の情報は,Enlightenの可視性と呼ばれている。
適切な可視性データを持つことは,光源からの光漏れを防ぐために必要であり,その結果,Enlightenはより正確な間接照明を提供できるようになる。
これらの可視性データを収集するために,Enlightenはシーン内のサンプリングポイントを事前に定義している(右図参照)。現在の実装では,サンプリングシャドウマップまたはレイキャスティングがEnlightenの可視性データを生成する一般的な方法となっている。ハードウェアによるレイトレーシング機能により,これらのデータを生成するための新しい方法として,レイトレースされたEnlighten visibilityを導入する。
この方法では,サンプリング点から光源までレイをトレースし,その間にあるオブジェクトと交差する場合は可視性の値をゼロに設定する。つまり,光源の位置が変化したり,移動するオブジェクトがシーンに干渉しても,リアルタイムで可視性が更新される。この方法は,あらゆるタイプの光源をサポートするという利点があり,単純にレイトレーシングをサポートするすべてのゲームエンジンに適応させることができる。
上の動画では,屋根の窓が閉まると間接照明がリアルタイムで暗くなっているのが分かる。トンネルに注目すると,直接光の量が減るにつれて,トンネル内に届く間接照明の量が減り,暗くなっている。
性能的には,透過する光線の種類は影の光線のみに限定されるようになった。光線の数は,可動するライトの数と,各ライトの影響を受けるサンプリングポイントの数で決まる。今回のデモでは,シーン全体に影響を与える単一の指向性ライトのみを配置した。これにより,4万点のサンプリングポイントが作成されたことになり,4万本のシャドウレイが発生し,GeForce RTX 2060を使用した場合,処理に0.04msかかった。
最初のトピックのスペキュラ/反射のあとに,拡散間接照明がどのように計算されるかを説明する。この図では,スポットライトとグレーの箱がある。スポットライトは天井の一部を照らしているが,これが直接光だ。疑問符のある部分は黒くなっているが,間接光で照らされているはずなので,Enlightenの出番だ。
最初の前計算段階では,Enlightenは静的アクター(形状と位置が固定されたアクター)について最適化された実行時データを生成する。実行時にEnlightenはこれらのデータを入力として受け取り,エンジンから提供された直接照明とマテリアル情報とともに,無限の光の跳ね返りから間接照明を生成する。
これが結果だ。
このセクションでは,とくに拡散照明について説明しているので,これが照明のみの結果だ。ここでは,照明の部分だけをレンダリングしている。
Enlightenでは,方向指示灯やスカイライトからの間接照明がリアルタイムで更新されている。しかし,青い電車は移動体なので,事前計算データが考慮されていないため,電車からの光の跳ね返りはレンダリングされていない。
次はFinal Gatherでのライティング機能だ。Final Gatherは,レンダリングポイントからの光線を透過させ,その光線が当たった場所の照明情報をまとめてくれる。最初の光の跳ね返りをシミュレートするだけなので,別のグローバルイルミネーションと組み合わせて使うことが多い。
※Final Gatherは大局照明の手法の1つで,視点からキャストしたレイがぶつかった先でレイをランダムに分散し,周辺の照明情報を集めて,それを平均化して陰影情報にする手法。フォトンマッピング的なGI手法に比べて処理が軽い。Unreal Engineでは4.24からレイトレーシングGIの要素に加えられている。
UE4のFinal Gatherの実装では,画面上のピクセルから光線が送信される。これらのピクセルからの光線がエリアに到達すると,それがギャザリングポイントのトリガーとなる。そして,シャドウレイはGather Pointから光源に送信される。このプロセスは通常,パストレーシングでは「次のイベント推定」と呼ばれている。ランダムに光線を透過させるのではなく,光源に直接透過させるので,より早く収束させることができる。
そして,Gather Pointsで照明を取得し,Screen Pixelsにまとめる。そして,Screen Pixelの間接照明の結果を得ることができる。下のように,動いている物体から光が跳ね返ってくる結果を見ることができる。
ということで,EnlightenのライティングをUE4のFinal Gatherと比較してみよう。Enlightenは無限のバウンスがあり,安定したライティング結果が得られ,GPUの負荷も重くない。ただし,ライトマップのピクセルサイズに基づいてディテールが制限されており,動いているオブジェクトにはバウンスがない。UE4のFinal Gatherでは,美しいファーストバウンスが得られ,動いているオブジェクトもバウンスをする。ただし,ファーストバウンスのみであり,ノイズが多い。
これらの利点と限界を見れば分かると思うが,2つのアプローチはお互いを補完し合っている。両方を組み合わせることで,Final Gatherの美しいファーストバウンドと並んでEnlightenの無限バウンドを得ることができ,それに加えてライトは動く物体をバウンドさせることができる。
これを行うには,2つのアプローチがある。スクリーンピクセルでEnlightenの結果を追加するか,Gather Pointsで追加するかだ。簡単にするために,ここではGather Pointでの結果に注目することにした。これは,Enlightenの結果がもう1回バウンドすることを意味し,可動オブジェクトから2回めのバウンドを得ることができる。Gather Pointsでの結果は,より明るいライティング結果が得られるので,ノイズの低減が期待できる。
結果を見ても分かるように,エンドレスバウンドのおかげでシーン全体が明るくなっている。では,下の丸で囲んだ部分を見てみよう。
Unreal Engine 4 Final Gatherの結果と比較すると,2回めのバウンスとそれに続くバウンスが追加されている。右側の赤レンガがバウンドしており,右側と上側に赤みがかかっている。動いている物体である電車からのバウンドも確認できる。
それでは下の比較スクリーンショットを見てみよう。
左下はパストレーシングの結果を参考にしているが,Unreal Engine 4のFinal Gatherの結果と比較し,EnlightenのReflectionを加えると,パストレーシングの結果に非常に近い結果になっている。Final Gather の結果と比較すると,ノイズは少なくなっているが,若干のノイズは残っている。
パフォーマンスの面では,Final Gatherだけでは,Create Gather Pointsパスで3.06msとなるが,Enlightenでは3.58msとなり,コストはまたしても比較的重要ではない。
これはまだ進行中の作業であり,詳細は追って明らかにする予定だ。Enlighten 3.12 リリースから,レイトレースされた Enlighten の可視性とレイトレース反射と Enlighten の組み合わせのサポートが早期アクセスで提供される。EnlightenとレイトレーシングFinal Gatherの組み合わせは,Experimentalとして提供される。
Enlightenの詳細はこちらを見てほしい。また,最近のEnlightenのチュートリアルビデオはこちらのYouTubeで確認できる。
※本記事は英国版の広告記事だが興味深い内容のため日本版でも取り上げる
新世代のゲーム機の発売に注目している人なら,レイトレーシングの話を聞いたことがあるだろう。
レイトレーシングとは,光の屈折と反射をシミュレートすることで,フォトリアリスティックなグラフィックスを実現するレンダリング技術だ。言い換えれば,ビデオゲームの中で光を現実の生活の中と同じように振る舞わせる。これは,光線をシミュレートし,光のビームが物理的な世界で進む経路をトレースする手法だ。これにより非常に印象的な画像が得られるが,GPUの改善により,現代のゲームでは現実のものになりつつある。
しかし,欠点もある。デベロッパがレイトレーシングのみを使用する場合,高品質のグローバルイルミネーションを確保するためには,大量の光線を投影する必要がある。ゲームは高度なインタラクティブ環境を必要とするため,最新のハイエンドGPUカードを使用しても十分な計算が困難な場合があるのだ。
そこで我々の出番だ。我々は,Enlightenのダイナミックライティング技術(参考URL)とリアルタイムのレイトレーシングを使用してフォトリアリスティックな画像をレンダリングする方法を研究しており,レイトレーシング効果を最大化しながらパフォーマンスを向上させるハイブリッドな方法を開発している。
これはまだ開発中のプロジェクトであり,最終的にはパフォーマンスと結果が改善され,異なる結果が得られることを期待している。
まずは,鉄道の操車場のデモから始めよう。このデモは Unreal Engine 4 で作成した(このテクニックは他のエンジンにも適用できるが)。光源は,1つの指向性ライトと 1つのスカイライトのみだ。
Enlighten を使用したレイトレーシング反射
最初のトピックは,Enlightenを使ったレイトレーシング反射についてだ。
反射の最も一般的なアプローチは環境キューブマップで,UE4ではReflection Captureと呼ばれている。
もう1つのアプローチは,スクリーン空間反射(SSR)だ。これは,カメラの角度に依存するが,画像内で反射が見られる場合,美しい結果をもたらすことができる。これらの反射が可視スクリーンの外にある場合はアーティファクトが発生する可能性がある。
そして,レイトレーシングがある。反射光線は表面から伝播し,光線がある領域に到達すると,そのマテリアルが計算されて結果が返される。SSRのような制限がなく,反射がシーン全体を埋め尽くし,美しい結果が得られる。
現在の実装では,リアルタイムで更新される環境キューブマップを採用している。光の角度が変化すると,キューブマップ上の直接光と間接光がCPUによってリアルタイムに更新される。GPU側ではCPUが生成したキューブマップをサンプルするだけで,Enlightenの全体的なコストは小さく,パフォーマンスに影響を与えない。
レイトレーシング反射では,画面外のオブジェクトも含めてシーン全体をリアルタイムで更新する。高精度な結果が得られるが,光沢反射の場合,複数の光線を送信する必要がある。また,場合によっては2回めのバウンスを追加する必要があり,パフォーマンスに影響を与える。
我々の目的は,シーン全体をリアルタイムで更新し,画面外のオブジェクトを反射に含め,レイトレーシング反射による高精度な結果を生成し,Enlightenの間接照明と組み合わせて,よりリアルな結果を得ること,そしてレイトレーシングだけではパフォーマンスのヒットが大きい場合にEnlightenにフォールバックする機能を追加することだ。
では,結果を見てみよう。中央のボールが鏡面反射をしている。間接照明がいかにアップデートされているかが分かる。
さらに,右下のレールを見てほしい。ラフネスの値を変更して,上のテクスチャが滑らかで下のテクスチャが粗くなるようにしている。ラフな部分はEnlighten cubemapsにフォールバックしている。レイトレーシングの結果とEnlighten cubemapの結果がシームレスに変化している。
パフォーマンス面では,同じシーンを使って,Enlightenを追加する前後のパフォーマンスを比較してみた。Enlightenを導入していない場合,レイトレーシングの反射は1.72msだが,Enlighten導入後は1.87msまでしか上昇しないので,Enlightenを追加するコストはかなり小さいと言える。Fallback to Enlighten機能を使えば,ラフネスの最大値が下がるにつれてパフォーマンスが大幅に向上する。
レイトレースによるEnlightenの可視性
実行時には,ゲームエンジンは光源情報だけでなく,その光源に関する影の情報もEnlightenに提供する必要がある。この影の情報は,Enlightenの可視性と呼ばれている。
適切な可視性データを持つことは,光源からの光漏れを防ぐために必要であり,その結果,Enlightenはより正確な間接照明を提供できるようになる。
この方法では,サンプリング点から光源までレイをトレースし,その間にあるオブジェクトと交差する場合は可視性の値をゼロに設定する。つまり,光源の位置が変化したり,移動するオブジェクトがシーンに干渉しても,リアルタイムで可視性が更新される。この方法は,あらゆるタイプの光源をサポートするという利点があり,単純にレイトレーシングをサポートするすべてのゲームエンジンに適応させることができる。
上の動画では,屋根の窓が閉まると間接照明がリアルタイムで暗くなっているのが分かる。トンネルに注目すると,直接光の量が減るにつれて,トンネル内に届く間接照明の量が減り,暗くなっている。
性能的には,透過する光線の種類は影の光線のみに限定されるようになった。光線の数は,可動するライトの数と,各ライトの影響を受けるサンプリングポイントの数で決まる。今回のデモでは,シーン全体に影響を与える単一の指向性ライトのみを配置した。これにより,4万点のサンプリングポイントが作成されたことになり,4万本のシャドウレイが発生し,GeForce RTX 2060を使用した場合,処理に0.04msかかった。
Enlightenを使ったFinal Gatherのレイトレーシング
最初のトピックのスペキュラ/反射のあとに,拡散間接照明がどのように計算されるかを説明する。この図では,スポットライトとグレーの箱がある。スポットライトは天井の一部を照らしているが,これが直接光だ。疑問符のある部分は黒くなっているが,間接光で照らされているはずなので,Enlightenの出番だ。
最初の前計算段階では,Enlightenは静的アクター(形状と位置が固定されたアクター)について最適化された実行時データを生成する。実行時にEnlightenはこれらのデータを入力として受け取り,エンジンから提供された直接照明とマテリアル情報とともに,無限の光の跳ね返りから間接照明を生成する。
これが結果だ。
このセクションでは,とくに拡散照明について説明しているので,これが照明のみの結果だ。ここでは,照明の部分だけをレンダリングしている。
Enlightenでは,方向指示灯やスカイライトからの間接照明がリアルタイムで更新されている。しかし,青い電車は移動体なので,事前計算データが考慮されていないため,電車からの光の跳ね返りはレンダリングされていない。
次はFinal Gatherでのライティング機能だ。Final Gatherは,レンダリングポイントからの光線を透過させ,その光線が当たった場所の照明情報をまとめてくれる。最初の光の跳ね返りをシミュレートするだけなので,別のグローバルイルミネーションと組み合わせて使うことが多い。
※Final Gatherは大局照明の手法の1つで,視点からキャストしたレイがぶつかった先でレイをランダムに分散し,周辺の照明情報を集めて,それを平均化して陰影情報にする手法。フォトンマッピング的なGI手法に比べて処理が軽い。Unreal Engineでは4.24からレイトレーシングGIの要素に加えられている。
UE4のFinal Gatherの実装では,画面上のピクセルから光線が送信される。これらのピクセルからの光線がエリアに到達すると,それがギャザリングポイントのトリガーとなる。そして,シャドウレイはGather Pointから光源に送信される。このプロセスは通常,パストレーシングでは「次のイベント推定」と呼ばれている。ランダムに光線を透過させるのではなく,光源に直接透過させるので,より早く収束させることができる。
そして,Gather Pointsで照明を取得し,Screen Pixelsにまとめる。そして,Screen Pixelの間接照明の結果を得ることができる。下のように,動いている物体から光が跳ね返ってくる結果を見ることができる。
ということで,EnlightenのライティングをUE4のFinal Gatherと比較してみよう。Enlightenは無限のバウンスがあり,安定したライティング結果が得られ,GPUの負荷も重くない。ただし,ライトマップのピクセルサイズに基づいてディテールが制限されており,動いているオブジェクトにはバウンスがない。UE4のFinal Gatherでは,美しいファーストバウンスが得られ,動いているオブジェクトもバウンスをする。ただし,ファーストバウンスのみであり,ノイズが多い。
これらの利点と限界を見れば分かると思うが,2つのアプローチはお互いを補完し合っている。両方を組み合わせることで,Final Gatherの美しいファーストバウンドと並んでEnlightenの無限バウンドを得ることができ,それに加えてライトは動く物体をバウンドさせることができる。
これを行うには,2つのアプローチがある。スクリーンピクセルでEnlightenの結果を追加するか,Gather Pointsで追加するかだ。簡単にするために,ここではGather Pointでの結果に注目することにした。これは,Enlightenの結果がもう1回バウンドすることを意味し,可動オブジェクトから2回めのバウンドを得ることができる。Gather Pointsでの結果は,より明るいライティング結果が得られるので,ノイズの低減が期待できる。
結果を見ても分かるように,エンドレスバウンドのおかげでシーン全体が明るくなっている。では,下の丸で囲んだ部分を見てみよう。
Unreal Engine 4 Final Gatherの結果と比較すると,2回めのバウンスとそれに続くバウンスが追加されている。右側の赤レンガがバウンドしており,右側と上側に赤みがかかっている。動いている物体である電車からのバウンドも確認できる。
それでは下の比較スクリーンショットを見てみよう。
左下はパストレーシングの結果を参考にしているが,Unreal Engine 4のFinal Gatherの結果と比較し,EnlightenのReflectionを加えると,パストレーシングの結果に非常に近い結果になっている。Final Gather の結果と比較すると,ノイズは少なくなっているが,若干のノイズは残っている。
パフォーマンスの面では,Final Gatherだけでは,Create Gather Pointsパスで3.06msとなるが,Enlightenでは3.58msとなり,コストはまたしても比較的重要ではない。
これはまだ進行中の作業であり,詳細は追って明らかにする予定だ。Enlighten 3.12 リリースから,レイトレースされた Enlighten の可視性とレイトレース反射と Enlighten の組み合わせのサポートが早期アクセスで提供される。EnlightenとレイトレーシングFinal Gatherの組み合わせは,Experimentalとして提供される。
Enlightenの詳細はこちらを見てほしい。また,最近のEnlightenのチュートリアルビデオはこちらのYouTubeで確認できる。
※本記事はGamesIndustry.bizとのライセンス契約のもとで翻訳されています(元記事はこちら)