連載
西川善司の3DGE:ノイジーな素材からレイトレ品質映像をリアルタイムに作る。「Project Spotlight」の技術にGPUの新たな進化が見えた
DirectXにレイトレーシングパイプラインを統合したMicrosoftの「DirectX Raytracing」(関連記事,以下 DXR)と,DXRのNVIDIA版ランタイムとなるリアルタイムレイトレーシング技術「RTX Technology」(関連記事,以下 RTX)の登場が,そのきっかけとなったことは,4Gamer読者も把握しているだろう。
リアルタイムレイトレーシングとはいえ,現在のGPU性能では,1ピクセルあたり数本のレイ(光線)をキャスト(投げる)するのが限界で,シーンのすべてをレイトレーシングでリアルタイムにレンダリングできるわけではない。たとえば,「3DMark」で有名な旧Futuremark(現UL)は,DXRを現行GPUでゲームグラフィックスに利用する場合,「1ピクセルあたり1レイのキャストでの鏡面反射の映り込みのような表現に限定するのが現実的」と主張して,そのアイデアを具現化した技術デモを公開している。
Project Spotlightについては,筆者によるレポートで何度も紹介しているため,すでに見たことがある人もいるだろうが,本稿ではたびたび言及するので,改めて見ておいてほしい。
Project Spotlightは,約15万ドル(約1654万円)もする高価なコンピュータでしか動作しないデモだが,そこに使われているレイトレーシングの要素は,リアルタイムグラフィックスに応用可能なものだ。それらすべてをリアルタイムグラフィックスで使うには,今のところDGX Stationの性能が必要になるだけで,必要な要素技術を選んで現行のゲームグラフィックスに組み合わせれば,ハイエンドGPUであれば,ぎりぎり利用できそうな状況にあるようだ。
そこで本稿では,Project Spotlightで用いられたレイトレーシング技術と,デモを実現したNVIDIAの技術を解説しよう。
完全動的な面光源の新技術が登場
さて,Project Spotlightのデモで使われている技術は,大別して以下の3つがある。
- Unreal Engineのバージョン4.20(以下,UE 4.20)に実装予定の新技術「面光源ライティング」(Area Lighting)
- Microsoftが2018年秋に提供予定であるDXRのレイトレーシングパイプライン
- NVIDIAが2018年秋に提供予定の「GameWorks Ray Tracing」に含まれるレイトレーシング関連ライブラリ
つまりProject Spotlightは,UE 4.20の新機能と,DXRによるレイトレーシング,GameWorksの新機能を使っていたわけだ。これらの概要について,GDC 2018におけるNVIDIAのセッション「Ray
まずはUE 4.20の新機能である面光源ライティングからだが,UEに詳しい人なら,「UE4でもすでに面光源は扱えるのでは?」という疑問を持つかもしれない。なぜなら,既存のUE4でも,範囲を限定した平行光源としてのスポットライト表現や,複数の点光源を任意の形状に並べた疑似的な「Virtual Point Light」的な手法で,面光源を表現することは可能だからだ。
ただ,これらはあくまでも擬似的な手法であり,物理ベースレンダリングシステムにおける汎用的な光源として,面光源を使うことはできなかった。
擬似的な手法と,本稿で扱う面光源とは何が違うのか,その基本をなるべく簡単に説明しておこう。
比較的ツルツルした球体に光を当てるとハイライトが生じるが,その形はおおむね光源の形になる。たとえば,光が星型になる照明をヘルメットなどに当てると,ヘルメットの表面には星型のハイライトが出るといった具合だ。
PlayStation 2世代までのゲームグラフィックスでは,光源に使えるのは基本的には点光源か平行光源だけだった。それがPlayStation 3世代(≒Direct X9世代)後期以降になると,環境マップテクスチャそのものを光源として取り扱う,イメージベースドライティングが採用されるようになり,ある種の面光源的な表現も可能となった。形状を持った光源としての面光源は,環境マップテクスチャとして取り扱えばよいわけで,PlayStation 4時代(≒DirectX 11世代)では,この手法が使われているわけだ。
ところが,面光源を環境マップテクスチャとして取り扱うテクニックにも制限はある。たとえば,面光源が移動したり,対象物に近づいたりするときには,環境マップテクスチャを更新したり,数学的な補正も必要になるのだ。場合によっては,環境マップテクスチャを再レンダリングする必要もあったりして,あまりスマートなアプローチではない。
そんな現状を変える切っ掛けとなる論文を,ゲームエンジン「Unity」のエンジニアであるEric Heitz氏がSIGGRAPH 2016で発表している。「Real-Time Area Lighting: a Journey from Research to Production」(関連リンク1,関連リンク2)というその論文は,リアルタイム面光源ライティングの新しい実装法を提案するものだ。
詳細を知りたい人には,関連リンクを参照してもらうとして,ここでは簡単に説明しておくと,環境マップテクスチャによるイメージベースドライティングとあまり変わらない程度の処理負荷で,任意の四辺形による面光源でライティング(シェーディング)を行えるようにするテクニックである。
イメージベースドライティングは,周囲の情景を環境マップとしてレンダリングしたテクスチャを光源としてライティングを行う技術だが,このプロセスをもう少し算術的(解析学的)に実装したものがこの論文の手法になる。
扱える面光源は,四辺形であれば長方形でも正方形でもOK。面光源を単純な四辺形に限定し,視線ベクトルと法線ベクトル,材質を再現する反射特性(BRDF,Bidirectional Reflectance Distribution Function,ラフネス)のパラメータがあれば,任意のピクセル位置における光量値(積分値)を計算できる,というのがこのテクニックの要点だ。一般的なライティング用のパラメータを利用するので,点光源や平行光源による処理系との互換性も高い。
複雑な計算部分は,事前計算によって80KBほどの2Dテクスチャデータとして生成しておけるので,ピクセルシェーダ側の負荷は比較的軽量だと,Heitz氏は主張している。
このメカニズムの根幹となるのは,Heitz氏が考案した「Linearly Transformed Cosines」(以下,LTC)というテクニックにある。詳細な解説は,Unity公式Blogにあるので,興味がある人はそちらも参照してほしい。
なお,Heitz氏の論文では,取り扱う面光源を「単色同輝度の定数的な面光源」ではなく,面光源内部にある発光体の輝度や色を自由に設定できる拡張についても言及している。つまり,任意の画像テクスチャを面光源として扱えるのだ。
テクスチャアクセスが一段増えるので処理負荷がやや増えるほか,シェーディング演算で使うラフネスのパラメータに応じて,MIPMAPテクスチャを複数用意する必要もあるので,必要なデータ量が多少は増大するとのこと。しかし,ネオンサインや電光掲示板的なものを表現したり,任意の映像で面光源ライティングをしたりできるようになるので,表現の幅は大きく広がるだろう。
先述したとおり,Heitz氏はUnityのエンジニアであるため,Unityにはこの機能がすでに実装済みだ。Unityが2016年に発表したシネマティック技術デモ「ADAM」でも,この面光源ライティング法を採用していたそうである。この技法をUEで利用できるようになったというのが,UE 4.20における新機能というわけだ。
面光源による淡い影を少ないレイで生成するには?
こうして面光源によるライティングをUnity 2018やUE 4.20で利用できるようになったわけだが,1つ問題もある。Unity 2018やUE 4.20がサポートする面光源技法は,リアルタイムの影生成に対応していないのである。
より正確に言うと,面光源ライティングと対になる物理的に正確な影生成技法は導入していないので,平行光源や点光源で影を生成する従来通りのリアルタイム影生成技法(デプスシャドウ技法)で代用するようにというガイドラインを,UnityやEpic Gamesが出しているのだ。
レイトレーシングによる影生成に用いるアルゴリズムは,比較的シンプルだ。
まず,描画対象とするピクセルに対応する3D座標から,光源に向かってレイを投げ,それが別のオブジェクトに衝突したら,そのピクセルは遮蔽されているので影になると判断する。一方,遮蔽されることなく光源にレイが届けば,影ではないと判断できるという理屈だ。
ただ,これが面光源のような大きさがある光源だと,話は複雑になってくる。光源に向かって投げたレイが遮蔽元のオブジェクトに衝突したとしても,そのオブジェクトが,「任意の大きさを持つ面光源」をどの程度の割合で遮蔽しているのかによって,影の濃さが変化するためだ。
その概念を図で示してみよう。図の左は,点光源によってできる影で,中央は影のエッジが環境光によって淡くぼやける様子を示している。そして右端が,面光源を使った場合の影を図示したものだ。図中では,光が完全に遮蔽元のオブジェクトに覆い隠される領域を「本影」(Umbra),光の一部は届く領域を「半影」(Penumbra)と呼ぶ。
光が完全に遮蔽されて本影となる領域は,図右側の赤線内。それに対して,半影の領域は赤線と黄線の内側になるのだが,本影に近い=赤線に近い部分ほど影が濃くなり,本影から離れた黄線に向かって,グラデーションのように色が薄くなっていく。
このように,レイトレーシングによる影生成で面光源に対応するには,たくさんのレイを投げて,対象のピクセルがどのくらい他のオブジェクトに遮蔽されているかの遮蔽率を調べるのが理想的だ。しかし現状のGPU性能では,大量のレイを投げるような処理能力――レイ予算とでも言ったところか――はない。Project Spotlightにおいても,投げるレイは1ピクセルあたり1本のみとなったそうだ。もっとも,距離の二乗で減衰する光の特性も考慮すると,1本のレイでも演算量は増大するという。
実際にレイトレーシングで生成した影のサンプルが,下の画像である。床がザラザラしていることもあって,ブツブツとしたノイズだらけの影になっているのが分かるだろう。レイを1本しか投げていないので,正確な遮蔽率を求められていないために,こうなってしまうのだ。
そこで登場するのが,NVIDIAのGameWorks Ray Tracingに含まれるノイズ低減機能「Denoiser」(デノイザ)である。これを使うことで,1本のレイで生成した影からノイズを低減できるというのだ。
ノイズだらけのレイトレーシングで生成した影に対して,デノイザを適用したものが下の画像となる。足元の影は,遮蔽元となる足と対象ピクセル間の距離(投影距離)が短いので比較的くっきりしているが,頭部の影はほとんどぼやけているのが分かるだろう。面光源から生成する影は,投影距離が長いとボヤっとしてしまうのが正しいので,この画像は比較的忠実に再現していることになる。
なお,RTXでデノイザと聞いて,NVIDIAがRTXで提供する機械学習ベースの機能「AI Denoiser」のことかと思う人もいるだろうが,本稿で取り上げるGameWorks Ray Tracing版のデノイザ(以下,GWRTデノイザ)は,それとはまったく別物だ。
フルHD映像から1msでのノイズ低減を目指すGWRTデノイザ
GWRTデノイザは,ゲームグラフィックス用途向けに新開発されたもので,AI Denoiserよりも算術的な仕組みとなっている。物理的には正しくないのだが,デプスシャドウ技法による影生成をフィルタでぼかすよりも正確な影を生成できるので,使う価値があるというのがNVIDIAの主張だ。
とくに重要なのは処理負荷の低さである。NVIDIAによると,GWRTデノイザは,ゲームPC用のGeForce(※具体的なGPU名は未公開)を使用し,1920×1080ピクセルのフルHD解像度で1本のレイによるレイトレーシング描画を行ったレンダリング結果に対して,約1ms以下の処理時間でノイズ低減処理を行うことを目的として開発したそうだ。
デノイザとは,とどのつまり「ぼかし」処理なのだが,GWRTデノイザの中核となるぼかしアルゴリズムは,「Cross Bilateral Filter」(クロスバイラテラルフィルタ)というものだという。論文によっては,クロスバイラテラルフィルタのことを「Joint Bilateral Filter」と呼ぶこともあるのだが,基本的には同じものである。
まずは,基本となる「バイラテラルフィルタ」について説明しておこう。
ぼかし処理とは,あるピクセルの値(色)を,ピクセルの周囲にスプレーをかけるように拡散(平滑化)するような処理である。ぼかし処理で身近なものと言えば,画像編集ソフトなどで採用事例が多い「ガウスフィルタ」だろう。
ガウスフィルタは,処理対象のピクセルに近いピクセルほど大きな重みを与えて,現状の色を保持する傾向が強くなり,処理対象のピクセルから遠いほど色を保持する傾向が弱まり,色を保持しなくなるような色拡散を行う処理系だ。ただ,ガウスフィルタによるぼかしは,ノイズを周囲に広げはするものの,できあがった画像は,輪郭がぼやけたような見映えになってしまう。
そこでバイラテラルフィルタの出番だ。バイラテラルフィルタの基本概念は,ガウスフィルタと変わらない。ただ,色拡散のアルゴリズムを処理対象ピクセルからの距離だけでなく,隣接するピクセル同士の輝度差(≒色の差異)も考慮するのがポイントだ。輝度差が大きい部分には,色拡散処理を抑制するアルゴリズムをガウスフィルタに加えたようなイメージである。
ただ,フィルタを適用する全ピクセルを1つ1つ調べては,輝度差に応じて処理する必要があるため,演算量はガウスフィルタよりも多くなってしまう。
バイラテラルフィルタの分かりやすい特徴は,ザラザラしたノイズは平滑化するが,輪郭やディテールはそれなりに維持できるという点にある。ガウスフィルタとバイラテラルフィルタの違いを分かりやすく説明した動画を,コンピュータビジョン用プログラミングAPI「OpenCV」の公式Webサイトが公開していたので,参照してほしい。
GWRTデノイザによるノイズ低減処理には3種類がある
GWRTデノイザは,適用する用途に応じて3種類の機能を用意している。それぞれに特定の名前は付いていないようだが,本稿では便宜上,これらの機能を以下のように記す。
- Shadow Denoiser(影デノイザ)
- Ambient Occlusion Denoiser(AOデノイザ)
- Reflection Denoiser(リフレクションデノイザ)
NVIDIAは,これらを用いるとどのような表現が可能となるかをまとめた動画を公開している。まずは動画を見てもらったうえで,3種類のデノイザについて細かく説明していくとしよう。
まずは1つめの影デノイザからだが,これは1ピクセルあたり1本のレイキャストで生成した影に適用して,ノイズを低減するためのものだ。画面全体に対して1回といった画像処理的なものではなく,影生成元となる光源ごとに1回,個別に適用する必要があるという。
本来の(分散)レイトレーシングであれば,ラフネスにもとづく拡散率に応じて,複数の方向にレイを飛ばさなければならない。しかし,1ピクセルあたりレイを1本しか飛ばさない方法では,レイが飛ぶ方向はランダムになり,描画結果がノイズまみれになってしまうのだ。
NVIDIAが公開した画像をもとに,影デノイザによる処理の流れを見ていこう。
下に並べた画像は,左側が多数のレイを飛ばすレイトレーシングで影を生成したもので,右側は,一般的なデプスシャドウ技法(シャドウマップ技法)による影を生成したものである。影デノイザによるノイズ低減で目指すのは,左側の画像だ。
まず,1ピクセルあたり1本のレイによるレイトレーシングで影を作成してみると,当然ながらノイズまみれの影になる。
これに影デノイザを適用した結果が,以下の画像だ。オブジェクトから影までの距離が短いところは,ちゃんと鮮明な影となっているのが分かるだろう。デプスシャドウ技法による影と比べれば,どちらが多数のレイによるレイトレーシングの結果に近いかは一目瞭然だ。
影デノイザは,先述のバイラテラルフィルタをさらに拡張した「クロスバイラテラルフィルタ」を使用している。クロスバイラテラルフィルタとは,ぼかし処理を行うときに,処理対象そのものの画像とは別の画像も参照してぼかしのかけ具合を調整するという拡張版バイラテラルフィルタである。
クロスバイラテラルフィルタの事例としてよく挙げられるのが,MicrosoftがSIGGRAPH 2004で発表した論文「Digital
フラッシュ撮影した写真は明るさが一様になってしまうが,ノイズ低減の参考とすることで,ノイズだらけの写真から色味やディテールを崩すことなく,ノイズだけを低減できるのである。以下に掲載したサンプル画像を見ると,その効果は一目瞭然だろう。
簡単に言うと,ガウスフィルタをバイラテラルフィルタに拡張するときに導入した隣接するピクセル同士の輝度差を考慮する適応型の処理を,別の画像も参照して処理する拡張実装と言えようか。
影デノイザでクロスバイラテラルフィルタをどう使うかの話に戻ろう。影デノイザで参照する追加のパラメータには,
- レイが遮蔽物に到達するまでの距離
- 深度情報(デプス)
- 処理対象ピクセルの法線ベクトル
- 光源ベクトル
- 光源の大きさ
などが挙げられている。
これらのパラメータによって,レイが遮蔽物に到達するまでの距離が長かったり,光源の大きさが大きかったりする場合は,ぼけ具合を強くするといった具合に,クロスバイラテラルフィルタによる適応型の処理を行うのだ。
デノイザとは言うものの,実際の影デノイザはノイズだらけの影にぼかしをかけるものではなく,「処理対象のピクセルを,オブジェクトがどのくらい遮蔽しているか」という遮蔽率を計算するものだと,NVIDIAは説明していた。言い方を変えると,レイトレーシングで計算したピクセルにかかる影の色を,影デノイザで求めた遮蔽率で変調してから描画するということだ。
ここで重要な点は,画像編集ソフトにおけるポストエフェクトのように,レンダリング結果をぼかすわけではないので,ディテールが消失することはないということにある。このポイントは,後述するAOデノイザやリフレクションデノイザなどでも同様なので,覚えておいてほしい。
AOデノイザはAmbient Occlusionをレイトレーシングで実現する
続いては,2つめのAOデノイザについて説明しよう。
Project Spotlightでは,Ambient Occlusion(アンビエントオクルージョン,以下 AO)の処理も,RTXによるレイトレーシングで行っている。AOとは何かについて,4Gamerではたびたび説明しているので(関連記事),すべてを繰り返さないが,簡単におさらいするとAOとは,凹みが存在することで光源から局所的に遮蔽されているピクセルに対して,陰影を付加する技法である。略称の「SSAO」として目にすることの多い「Screen Space Ambient Occlusion」は,AOにおける技法の1つだ。
一見すると,写実的な陰影を描けているように見えるSSAOだが,遮蔽された部分だけでなく,3Dオブジェクトの輪郭にも影が付くことがある問題を抱えている。深度バッファ(Z Buffer)を調べるときに,3Dオブジェクトと背景の境界付近は,凹んで遮蔽されていると誤判断してしまいがちなのだ。
また,キャラクターが動いた場合は,深度バッファの内容も大きく変化するため,凹みも連動して変化する。そうなると,陰影が時間方向に安定していないように見えるのだ。SSAOは,静止画として見ると説得力のあるきれいな映像に見えるのだが,動いているゲーム画面では,不安定に見えることがよくあるのはそのためである。
そこで,Project Spotlightでは,SSAOを使わずに,レイトレーシングでAOを生成することにした。
一般的なレイトレーシングによるAO生成は,対象のピクセルから放射状にたくさんのレイを投げて,レイのうち何割が遮蔽物となるオブジェクトに衝突したかを求めて,その割合に応じて影を付けていく。多くのレイが遮蔽されているほど濃い影色になるし,少数のレイしか遮蔽されていなければ,影は薄くなる。アルゴリズム的には,先述した面光源からの影生成と似ていると言えようか。
さて,NVIDIAのGWRTデノイザは,このレイトレーシングAOを最適化した機能を用意している。それが本稿で言うAOデノイザだ。基本的なアイデアは,影デノイザと同じで,クロスバイラテラルフィルタを活用するという
AOデノイザでは,投げたレイが影を作っているオブジェクトに衝突するまでの距離が長ければ長いほど,ぼかし半径を広くするという方針でクロスバイラテラルフィルタを使用する。これにより,開けた空間ではぼかし半径が広くなるので淡い影になり,オブジェクト同士が隣接するような部分ではぼかし半径が狭くなるので濃い影ができるというわけだ。
サンプル画像でAOデノイザの効果を見ていこう。
今回も多数のレイで生成したレイトレーシングAOの結果を左に,SSAOを用いたレンダリング結果を右に並べてみた。レイトレーシングAOの画像は,輪郭の不自然な影がない。一方でSSAOの画像は,凹みの影こそ説得力があるものの,オブジェクトの輪郭全体に影がついた不自然さがある。
次に示した画像は,2本のレイだけで生成したレイトレーシングAOの例だ。見てのとおり,ノイズがひどい。
最後に示した画像が,2本のレイで生成したレイトレーシングAOに対して,AOデノイザを適用したものとなる。オブジェクトが接地している部分に濃いめの影が付くのが特徴だ。「環境光で生成した影」という点では,こちらの方が説得力が高い画像と言えよう。
リアルタイムレンダリングを実現するためには,大量のレイは投げられない。そこで,開発チームが実験を重ねて検討したところ,フルHD解像度におけるレイトレーシングAO生成では,1ピクセルあたり,16本のレイを放射状にキャストすると,それなりに納得できるAOが得られるようになったという。
しかし,現状のGPU性能では,1ピクセルから16本ものレイを一度にキャストするレイトレーシングをリアルタイムで実行できない。そこでProject Spotlightでは,1フレームあたり2本のレイをキャストすることにして,その後は8フレームにわたって1フレームごとにレイの方角を変えてキャストすることで,局所的な遮蔽率を求めたという。つまり,1フレームあたり2本,8フレーム分で計16レイのレイトレーシングAOを生成するわけだ。
複数フレームにわたり,少数のレイを投げてレイトレーシングを行い,必要なだけの情報が集まったらAO生成に必要な遮蔽率を計算するというのは,一見うまくいきそうだが,これは映像が静止している場合にしか成り立たない。視点が動いてしまえば映像も動くし,キャラクターが動いても同様だ。
映像が動くことに対処するために,Project Spotlightでは「モーションバッファ」を利用した。ここで言うモーションバッファ(≒ベロシティバッファ)とは,時間方向のアンチエイリアス処理である「Temporal Anti-Aliasing」で使うもので,フレーム内の各ピクセルが過去フレームのどこと対応するかを表すバッファである。これをレイトレーシングAOに使ったというのだ。
つまり,過去7フレーム分にわたるAOの計算結果とモーションバッファを照らし合わせたうえで,現在描画中のフレームにおけるAOの計算結果と組み合わせることで,最終的な遮蔽率を割り出すわけである。
とはいえ,カメラのアングルががらりと変わったり,シーンが切り替わったりした場合,過去7フレーム分の情報は役に立たない。事実上の消失だ。そんなときはどうするのか。
この場合は,GWRTデノイザのぼかし半径を増大させて,正確ではないが淡いAOとして生成することで,ノイズをそれなりに隠蔽するようにしたという。AOは淡くても見た目に支障はないものだし,さらに8フレーム分の時間が経過すれば,設計通りのAO効果が得られるので,気にしないことにしたようだ。
リフレクションの生成こそレイトレーシングの真骨頂
GWRTデノイザの3つめである,リフレクションデノイザについて説明しよう。
Epic GamesやNVIDIAは,レイトレーシングパイプラインにおける最大の見どころは,リフレクションにあると主張する。ここで言うリフレションとは,鏡面反射によって生じる映り込み,いわゆる鏡像のことだ。Project Spotlightでは,ストームトルーパーの指揮官「キャプテン・ファズマ」が身につけている銀ピカのアーマーや,テカテカの床などに,その分かりやすい効果が見られる。
リフレクション効果は,これまでのゲームグラフィックスでも使われていたが,そのアプローチは疑似的なものが主流だった。
たとえば,初代PlayStation時代の初期は,アーティストが描いた「それっぽい映り込み像」を描いた環境マップテクスチャを,適当にスクロールさせながら3Dモデルに適用する程度のものだった。それがPlayStation 2〜PlayStation 3時代(DirectX 9世代)になると,全方位の情景を事前にレンダリングしたキューブ環境マップとして生成しておき,これを視差補正しつつ3Dモデルに適用する手法が確立した。
キューブ環境マップは事前生成するものなので,背景が破壊されたり,キャラクターが動き回ったりする動的なシーンを正確に反映することはできないという欠点がある。そこで,動的なシーンにも対応できる映り込み表現として考案されたのが,レンダリング結果フレームを鏡像の素材にして,画面座標系の局所レイトレーシングで鏡像を生成する「Screen Space Reflection」(SSR,Realtime Local Reflectionとも)だ。
現在のゲームグラフィックスにおけるリフレクションは,大局的な鏡像をキューブ環境マップで,局所的な鏡像はSSRで表現するのが主流と言えよう。
ただ,SSRにも問題点はある。レンダリング結果フレームをもとに鏡像を生成するので,画面外にある情景を映り込ませることができないのだ。鏡像のもとになっているものが画面外に消えると,対応する鏡像も消失するという不自然な状況が起こりうる。画面外の情景による鏡像は,静的なキューブ環境マップで対応するのだが,最悪の場合,動的キャラクタが画面外に消えると,その鏡像も途中で消えてしまい,消えたあたりからキューブ環境マップに移行するので,境界線のようなものが見えてしまうこともあるのだ。
こうした不自然さを解消できるレイトレーシングによる鏡像生成には,高い価値があるというのが,Epic GamesとNVIDIAの主張である。
さて,Project Spotlightにおいて,RTXによるレイトレーシングでリフレクションを生成するときには,1ピクセルあたり2本のレイをキャストしているという。しかも,各レイは2回までバウンス(反射)することにしたそうだ。ここでいうバウンスとは,レンダリング対象ピクセルから視線の反射方向に投げたレイが,遮蔽物となるオブジェクトに衝突した場合,その衝突地点から反射する方向にレイを飛ばすことをいう。つまり2バウンスとは,レイの反射を2回行うという意味となる。
手鏡を持って鏡台の前に立つキャラクターを描画する例で考えてみよう。2回までレイがバウンスすると,鏡台にはキャラクターの鏡像だけでなく,キャラクターが持つ手鏡に写った部屋の情景も,鏡台に写る鏡像として描くことが可能になるわけだ。
現実世界の光はバウンス数が無限大であるので,計算するバウンス数が多いほど写実的な映像になるが,当然ながら計算量が増えて重くなる。そこでProject Spotlightでは,バウンス数を2回に設定したわけだが,これでさえも,Epic GamesやNVIDIAに言わせればやや重すぎたらしく,反省材料にしているという。実際のProject Spotlightにおいても,計算量の増加をカバーすべく,特別な最適化を2つ加えたそうだ。
最適化の1つめは,リフレクション生成用のレイトレーシングにおいて,3Dシーンの材質表現を非常に簡略化したこと。
Project Spotlightでメインとなる直接光によるライティングは,UE4のグラフィックスエンジンが採用した,Deferred Rendering(ディファードレンダリング)ベースの物理ベースレンダリングで行っている。通常のライティングなら,UE4のエディタで定義したかなり複雑な材質再現反射特性を使って物理ベースレンダリングを行うのだが,リフレクション生成用のレイトレーシングに使うときには,簡略化したパラメータに置き換えて処理しているそうだ。
最適化の2つめは,ザラザラとした粗い面にレイが衝突した場合には,そこにはもう鏡像ができにくいと見なして,2バウンスめのレイを投げないという手法である。先述した手鏡を持ったキャラクターの例で言うと,手鏡ではなくふわふわしたぬいぐるみを持っているなら,ぬいぐるみの表面には鏡像が生じないので,2バウンスめのレイは投げないという具合である。
さて,鏡のようなツルツルした材質であれば,くっきりとした鏡像が出るが,自然界や日常で目にする材質は,そこまでツルツルとしたものは多くないだろう。大抵の物体は,表面がそれなりにザラザラとしているわけで,こうしたざらつきは,材質パラメータのラフネスで表す。
レンダリング対象のピクセルにおけるラフネスが大きいと,そこはザラザラしていると判断できる。そのような材質の面は,隣接しているピクセル同士の視線方向に反射ベクトルがばらつくはずだ。つまり,拡散反射に近い反射特性となるわけで,たかだか2本のレイによるレイトレーシングでは,ノイズまみれのリフレクションとなってしまう。そこで登場するのがリフレクションデノイザだ。
下に並べた画像は,「面の粗さ=0.18」(※値が小さいほどツルツルしている)の床面にレイを投げるレイトレーシングによってリフレクションを生成した画像だが,左は1ピクセルあたり多数のレイを投げているのに対して,右は1ピクセルあたり1本しか投げていない。レイが1本の画像は,見てのとおりノイズだらけだ。
これの素材を使い,リフレクションデノイザを使ってノイズを低減したものが下の画像となる。ノイズが驚くほど低減されたのが分かるだろう。
影デノイザやAOデノイザと同様に,リフレクションデノイザも,クロスバイラテラルフィルタをベースにした技術である。リフレクションデノイザにおけるクロスバイラテラルフィルタは,材質パラメータのラフネスが大きいほど,ぼかし半径を広くする方針で動作しているそうだ。ただし,ぼかし半径の制御には,レンダリング対象ピクセルの位置が視点から遠ければ遠いほど,ぼかし半径は狭くする処理を加えて,不自然に見えないようにもしているとのことだった。
リアルタイムグラフィックスに適したGWRTデノイザ
NVIDIA製GPU以外への応用もあり得る
ここまでで3種類のデノイザを説明してきたわけだが,簡単にまとめると,GWRTデノイザとは,基本的にクロスバイラテラルフィルタである。そして,何を生成するためにレイトレーシングを活用するのかという用途に応じて,クロスバイラテラルフィルタの動作を規定するパラメータを変更し,用途別にGWRTデノイザの動作を最適化したものが,影デノイザやAOデノイザ,リフレクションデノイザであると理解すれば分かりやすい。
GWRTデノイザの根幹技術は,バイラテラルフィルタであり,現状のGPUでも比較的高速化しやすいため,リアルタイム性に優れる手法と言える。少なくとも,機械学習ベースのAIデノイザよりはゲームグラフィックス向きと言えるだろう。
また,AIデノイザとは異なり,Volta世代GPUにしかないTensor Coreも使っていないので,汎用性にも優れる。それこそ,NVIDIA以外のGPUでの実装も容易だと思われる。
一方で,現在のGWRTデノイザには,大きく分けて3つの制限もあるという。
1つは影デノイザの仕様で,複数の面光源が複数の影を生成した場合,影が重なる部分の品質がやや劣ることだそうだ。もう1つは,キャストするレイの数を多くしないと,AOデノイザでは良い結果が得られないこと。そしてリフレクションデノイザにも,ラフネス値が上がる(面の粗さが増す)と品質が下がることだそうだ。
Project SpotlightにGPU進化の夢を見た
実際には導入されなかったそうなので,本稿では詳しく触れないが,Project Spotlightでは,RTXによるレイトレーシングを使って,リアルタイムの間接光表現などの実装も試みたそうだ。しかし,3種類のデノイザを処理するとGPU性能に余裕がなかったそうで,実験的な実装だけに留めて,Project Spotlightへの組み込みは見送ったそうだ。
そのため,Project Spotlightにおける間接光表現は,本稿で解説したレイトレーシングベースのAOやリフレクション以外には,UE4の標準機能である事前計算ベースの間接光表現機能「Lightmass」を使うに留めたという。
Project Spotlightは,15万ドルもするDGX Stationでしか動作しないのだが,
なお,現行のUE4はDirectX 12に対応しているものの,PCが搭載するGPUを個別に駆動させる「Multi Display Adapter」(MDA)モードには対応していない。そこで,MDAモードにも急遽対応を図ったとのことだ。UE4のMDAモード正式対応は,UE 4.20か,その次となるUE 4.21となるようだ。
結局Project Spotlightでは,4基のGPUのうち1基をメインGPUとして,ほか3基はほぼレイトレーシング専用の「Helper GPU」として利用する実装とすることで,なんとか目的の24fpsを達成できたとのこと。つまり,1フレーム生成するのに140msかかっていた処理を,GPUを4基使うことで,3倍以上速い約42msまで短縮できたわけだ。
そろそろまとめに入ろう。
面光源ライティングとRTXによるレイトレーシング,GWRTデノイザを活用するProject Spotlightが,TITAN Vでもわずか7fpsしか出ないほど高負荷であるという事実を,むしろ夢のあることだと筆者は受け止めている。というのも,PlayStation 4時代に突入してから,ゲームグラフィックスの表現手法がやや頭打ちの状況にあるように感じていたからだ。
最近,ゲームグラフィックスに導入された新要素といえば,4Kや8Kといった高解像度レンダリングか,HDRや広色域対応といった見映えの拡張に留まっていた。これらの新技術は,ゲームグラフィックスの技術が基点となっているわけではなく,ディスプレイ技術やビデオ映像技術が基点であり,ゲームグラフィックス表現の根本的な進化とは,それほど深い関係があるものではない。
しかし,Project Spotlightによって,今後のGPUが目指すべき道が,高解像度化や見映えの改善以外にも示されたという点で,夢があると感じたのだ。
レイトレーシングによる影生成やAO生成,リフレクションのすべてを,ゲームグラフィックスに導入する必要はないとは思うし,GPU性能的にもそれは無理だろう。ゲームグラフィックスの表現において,とくに目立たせたいポイントや,補いたい弱点をカバーするといった目的などに応じて,適切なレイトレーシングを活用すればいいと考える。
GPU性能が向上していく流れに合わせて,ゲームグラフィックスにおけるレイトレーシング活用を広げていけばいいのだ。
[GDC 2018]映像やAR/VR,さらにリアルタイムレイトレーシングまで! 2018年のUnreal Engineはこうなる
[GDC 2018]西川善司の3DGE:DirectX Raytracingにおける最適解は「レイトレーシングを行わないこと」!? Futuremarkが語るその真意
[GDC 2018]「RTX」一色のNVIDIAブースで,ゲームにおけるレイトレーシング技術の活用アイデアをチェック
- 関連タイトル:
Unreal Engine
- 関連タイトル:
Volta(開発コードネーム)
- この記事のURL: