2020年4月22日
AstroNaughty Games による宇宙ゲーム『Grimmstar』でのレイトレーシングの実装
宇宙空間をライティングする場合に生じる問題
『Grimmstar』の舞台は、複数の太陽系全体です。プレイヤーはそれらの太陽系を自由に移動できます。ゲームには、かなり巨大なレベルを組み込む必要があります。そして、そのようなレベルには、巨大な惑星や月、恒星、その他の天体が置かれることになりますが、これらは、プレイヤーの宇宙船と比べてリアルな大きさをもたなければなりません。そのような条件によりいくつかの問題が生じました。第一の問題は、各レベルのライティング情報を構築すること (Lightmass Importance Volumes を使用した場合でも) は非常に大変な作業だということです。1 個のサブレベルでも、7GB のライトマップ情報が作成されます。それではまずいので、[Force No Precomputed Lighting](事前計算されたライティングを作成しない) にチェックを入れるしかありませんでした。 第二の問題は、オブジェクトの大部分は宇宙に置かれているため、動的に移動しているということです。宇宙ステーションのリング、小惑星、船、惑星、月は抵抗がないためすべて動きます。最後の問題は、オブジェクト間の距離が非常に大きく、レベル内のアセットのサイズがさまざまであるため、カスケード シャドウ マップを使用すると、期待した結果にならないということです。駄目というほどではありませんが、私たちが目指しているクオリティには達しないのです。
リアルタイム レイトレーシングによってこれらの問題はどのように解決されるのか
事前計算されたライティングを使用していない (ライトビルド情報がない) ため、RTX により、信じられないほど素晴らしいシャドウがリアルタイムで実現できます。このことは、メッシュが静的動的のどちらに設定されているかに関係なく、プレーヤーの置かれている場所に左右されません。そのため、本当に宇宙にいるのだという気になるのです。左:カスケード シャドウ マップが使われ、シャドウ ソフトネスが全体的に適用されています。反射は何もキャプチャしていません。
右:シャドウが遠ざかるにつれて、シャープな状態からソフトに変化します。採掘フリゲートの窓は反射します。レイトレースされた反射によって金属の表面がリアルになります。
右:シャドウが遠ざかるにつれて、シャープな状態からソフトに変化します。採掘フリゲートの窓は反射します。レイトレースされた反射によって金属の表面がリアルになります。
シャドウの問題が解決されたので、私たちはさらに一歩進め、レイトレース反射を追加しました。これにより、特定のアセットがこれまでにないレベルの忠実度をもつようになりました。パイロットのバイザーが宇宙船コックピットの多機能ディスプレイを反射する ― といったような細いディテールによって、そのリアリティは強化され、シネマティックスの能力も一層充実したのです。 以前であれば、一部のアセットは、かなり平坦でシャドウ情報には深みが欠けていました。しかし、これらが鮮やかに塗料でコーティングされた金属構造物として表示されるようになりました。グローバル ポスト プロセシング ボリュームの最大ラフネス値を微調整することによって、反射面上で RTX 反射を計算するしないを制御したため、驚くほど素晴らしい出来栄えとなりました。しかもパフォーマンスが低下することもなかったのです。
左:『Grimmstar』の宇宙ステーション アセットで標準的なライティング モデルを使用したところ。 右:RTX シャドウ/反射を有効にすると、宇宙ステーションにこれまにないレベルのリアリティがもたらされます。
パフォーマンスの改善
リアルタイム レイトレーシングは、リソースをきわめて多く消費するライティング方式です。しかし、ありがたいことに Unreal Engine は、使用される複数のライティング テクニックを見事にハイブリッド化してくれます。これにより、RTX テクノロジーと、標準的なライティング方式を組み合わせることによって、いいとこ取りができるのです。たとえば、私たちは、RayTracingQualitySwitch というノードを使って、ほとんどのレイトレース反射について法線情報を無効にしています。法線を頻繁に使用すると、ライティング情報がさまざまな方向に反射し、良い結果を得るために、さらに多くの情報を収集する必要が生じるのです。私たちは、反射バウンスをともなう法線情報を無効にすることで、そのような余計な計算のいくらかを無効にしています。 その上、私たちは、プレイヤーのために設定を最適化することを最初から怠りませんでした。これは、現在のデモで使用しているパーシスタント レベルの起動時にコンソール変数をセットすることにより実施されています。これらの変数の多くは、Unreal Engine のコンソールに r.RayTracing と打ち込むことで見つけることができます。そのようにして自由に利用できるものをすべて調べることができます。私たちが使用している変数の例をあげると、r.RayTracing.Reflections.HeightFog を 0 に設定し、r.RayTracing.Reflections.ScreenPercentage を 50 に設定しています。反射の Screen Percentage を下げることによって、レイトレース反射に必要な計算を大幅に減らすことができるのです。それでも出来栄えは非常に良好で、ほとんどのシナリオではまず気になりません。反射を改善する必要がある場合は、私たちはいつも別のボリュームをセットしてそれをオーバーライドします。リアルタイムのレイトレース ライティングは、『Grimmstar』というゲームのスコープとスケールには、まさにうってつけの技術です。いくつかの技術的な問題を解決しただけにとどまらず、その出来栄えが従来のライティング テクニックよりも優れています。このテクニックはまだ成熟途上にあるものの、パフォーマンスと方法には絶え間なく改善が加えられており、柔軟性が高く、際立ってリアルなライティング結果が得ることができます。