オススメ機能
Twitter
お気に入り
記事履歴
ランキング
4Gamer.net
お気に入りタイトル/ワード

タイトル/ワード名(記事数)

最近記事を読んだタイトル/ワード

タイトル/ワード名(記事数)

LINEで4Gamerアカウントを登録
西川善司の3DGE:ノイジーな素材からレイトレ品質映像をリアルタイムに作る。「Project Spotlight」の技術にGPUの新たな進化が見えた
特集記事一覧
注目のレビュー
注目のムービー

メディアパートナー

印刷2018/05/26 00:00

連載

西川善司の3DGE:ノイジーな素材からレイトレ品質映像をリアルタイムに作る。「Project Spotlight」の技術にGPUの新たな進化が見えた

Unreal Engine
 2018年3月に行われた大きな開発者向けイベント「Game Developers Conference 2018」(以下,GDC 2018)と「GPU Technology Conference 2018(以下,GTC 2018)におけるゲームグラフィックスの話題で中心となったのは,「ゲームグラフィックスでレイトレーシングが使えるようになる」ことだった。
 DirectXにレイトレーシングパイプラインを統合したMicrosoftの「DirectX Raytracing」(関連記事,以下 DXR)と,DXRのNVIDIA版ランタイムとなるリアルタイムレイトレーシング技術「RTX Technology」(関連記事,以下 RTX)の登場が,そのきっかけとなったことは,4Gamer読者も把握しているだろう。

 リアルタイムレイトレーシングとはいえ,現在のGPU性能では,1ピクセルあたり数本のレイ(光線)をキャスト(投げる)するのが限界で,シーンのすべてをレイトレーシングでリアルタイムにレンダリングできるわけではない。たとえば,「3DMark」で有名な旧Futuremark(現UL)は,DXRを現行GPUでゲームグラフィックスに利用する場合,「1ピクセルあたり1レイのキャストでの鏡面反射の映り込みのような表現に限定するのが現実的」と主張して,そのアイデアを具現化した技術デモを公開している。

Project Spotlightのデモ環境。左に見えるのがDGX Stationだ
Unreal Engine
 一方,NVIDIAとEpic Gamesは,Volta世代GPU「GV100」をベースとする数値演算アクセラレータ「Tesla V100」を4基搭載した「DGX Station」で動作するUnreal Engine 4(以下,UE4)ベースのリアルタイム技術デモ「Project Spotlight」を開発し,GDC 2018やGTC 2018で公開した。
 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 Tracing in Games with NVIDIA RTX」と,GTC 2018におけるNVIDIAとEpic Gamesの共同セッション「Cinematic Lighting in Unreal Engine」で説明されたので,要点をまとめてみよう。

 まずはUE 4.20の新機能である面光源ライティングからだが,UEに詳しい人なら,「UE4でもすでに面光源は扱えるのでは?」という疑問を持つかもしれない。なぜなら,既存のUE4でも,範囲を限定した平行光源としてのスポットライト表現や,複数の点光源を任意の形状に並べた疑似的な「Virtual Point Light」的な手法で,面光源を表現することは可能だからだ。
 ただ,これらはあくまでも擬似的な手法であり,物理ベースレンダリングシステムにおける汎用的な光源として,面光源を使うことはできなかった。

 擬似的な手法と,本稿で扱う面光源とは何が違うのか,その基本をなるべく簡単に説明しておこう。
 比較的ツルツルした球体に光を当てるとハイライトが生じるが,その形はおおむね光源の形になる。たとえば,光が星型になる照明をヘルメットなどに当てると,ヘルメットの表面には星型のハイライトが出るといった具合だ。

Project Spotlightの素材を利用した面光源のデモ映像。ファーストオーダーのシンボルマークを面光源にすると(上),ストームトルーパーのヘルメットなどにシンボルマーク形状のハイライトがつく(下)。Epic Gamesが公開したGDC 2018における講演「Cinematic Lighting in Unreal Engineより引用
Unreal Engine
Unreal Engine

 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,ラフネス)のパラメータがあれば,任意のピクセル位置における光量値(積分値)を計算できる,というのがこのテクニックの要点だ。一般的なライティング用のパラメータを利用するので,点光源や平行光源による処理系との互換性も高い。

Heitz氏の考案した面光源ライティング法を説明するスライド

 複雑な計算部分は,事前計算によって80KBほどの2Dテクスチャデータとして生成しておけるので,ピクセルシェーダ側の負荷は比較的軽量だと,Heitz氏は主張している。

複雑な計算が必要となる変換データテーブルは,面光源の形状ごとに事前計算で生成しておく
Unreal Engine

 このメカニズムの根幹となるのは,Heitz氏が考案した「Linearly Transformed Cosines」(以下,LTC)というテクニックにある。詳細な解説は,Unity公式Blogにあるので,興味がある人はそちらも参照してほしい。

 なお,Heitz氏の論文では,取り扱う面光源を「単色同輝度の定数的な面光源」ではなく,面光源内部にある発光体の輝度や色を自由に設定できる拡張についても言及している。つまり,任意の画像テクスチャを面光源として扱えるのだ。
 テクスチャアクセスが一段増えるので処理負荷がやや増えるほか,シェーディング演算で使うラフネスのパラメータに応じて,MIPMAPテクスチャを複数用意する必要もあるので,必要なデータ量が多少は増大するとのこと。しかし,ネオンサインや電光掲示板的なものを表現したり,任意の映像で面光源ライティングをしたりできるようになるので,表現の幅は大きく広がるだろう。

GeForce GTX 980上でGGX BRDFベースの物理ベースシェーダを使い,LTCによる面光源ライティングをピクセルシェーダで処理するのに要する時間を検証したサンプル。フルHD解像度の場合,四角形を面光源にした左の画像をレンダリングするのに要した時間は2.4msで,順に7.5ms,2.4msになったそうだ。星型の面光源で処理時間が長いのは,複数の面光源を組み合わせて星型を作っているため。右側の絵柄が付いた面光源の負荷が,左の単純な面光源と変わらないのは,四辺形を1つしか使っていないからだ
Unreal Engine

 先述したとおり,Heitz氏はUnityのエンジニアであるため,Unityにはこの機能がすでに実装済みだ。Unityが2016年に発表したシネマティック技術デモ「ADAM」でも,この面光源ライティング法を採用していたそうである。この技法をUEで利用できるようになったというのが,UE 4.20における新機能というわけだ。


面光源による淡い影を少ないレイで生成するには?


 こうして面光源によるライティングをUnity 2018やUE 4.20で利用できるようになったわけだが,1つ問題もある。Unity 2018やUE 4.20がサポートする面光源技法は,リアルタイムの影生成に対応していないのである。
 より正確に言うと,面光源ライティングと対になる物理的に正確な影生成技法は導入していないので,平行光源や点光源で影を生成する従来通りのリアルタイム影生成技法(デプスシャドウ技法)で代用するようにというガイドラインを,UnityやEpic Gamesが出しているのだ。

Unreal Engine
 しかし,UE4ベースのProject Spotlightでは,面光源による影生成を行っている。どうやって影生成を実現したのかというと,DXRおよびRTXによるレイトレーシングを用いたという。その仕組みについて説明していこう。

 レイトレーシングによる影生成に用いるアルゴリズムは,比較的シンプルだ。
 まず,描画対象とするピクセルに対応する3D座標から,光源に向かってレイを投げ,それが別のオブジェクトに衝突したら,そのピクセルは遮蔽されているので影になると判断する。一方,遮蔽されることなく光源にレイが届けば,影ではないと判断できるという理屈だ。

 ただ,これが面光源のような大きさがある光源だと,話は複雑になってくる。光源に向かって投げたレイが遮蔽元のオブジェクトに衝突したとしても,そのオブジェクトが,「任意の大きさを持つ面光源」をどの程度の割合で遮蔽しているのかによって,影の濃さが変化するためだ。

 その概念を図で示してみよう。図の左は,点光源によってできる影で,中央は影のエッジが環境光によって淡くぼやける様子を示している。そして右端が,面光源を使った場合の影を図示したものだ。図中では,光が完全に遮蔽元のオブジェクトに覆い隠される領域を「本影」(Umbra),光の一部は届く領域を「半影」(Penumbra)と呼ぶ。
 光が完全に遮蔽されて本影となる領域は,図右側の赤線内。それに対して,半影の領域は赤線と黄線の内側になるのだが,本影に近い=赤線に近い部分ほど影が濃くなり,本影から離れた黄線に向かって,グラデーションのように色が薄くなっていく。

本影と半影ができる仕組み。「ゲーム制作者になるための3Dグラフィックス技術 増補改訂版」(西川善司著,インプレス刊)より引用
Unreal Engine

 このように,レイトレーシングによる影生成で面光源に対応するには,たくさんのレイを投げて,対象のピクセルがどのくらい他のオブジェクトに遮蔽されているかの遮蔽率を調べるのが理想的だ。しかし現状のGPU性能では,大量のレイを投げるような処理能力――レイ予算とでも言ったところか――はない。Project Spotlightにおいても,投げるレイは1ピクセルあたり1本のみとなったそうだ。もっとも,距離の二乗で減衰する光の特性も考慮すると,1本のレイでも演算量は増大するという。

 実際にレイトレーシングで生成した影のサンプルが,下の画像である。床がザラザラしていることもあって,ブツブツとしたノイズだらけの影になっているのが分かるだろう。レイを1本しか投げていないので,正確な遮蔽率を求められていないために,こうなってしまうのだ。

1ピクセルあたり1レイをキャストして生成した影。輪郭に近いほどノイズが多くなっている
Unreal Engine

 そこで登場するのが,NVIDIAのGameWorks Ray Tracingに含まれるノイズ低減機能「Denoiser」(デノイザ)である。これを使うことで,1本のレイで生成した影からノイズを低減できるというのだ。
 ノイズだらけのレイトレーシングで生成した影に対して,デノイザを適用したものが下の画像となる。足元の影は,遮蔽元となる足と対象ピクセル間の距離(投影距離)が短いので比較的くっきりしているが,頭部の影はほとんどぼやけているのが分かるだろう。面光源から生成する影は,投影距離が長いとボヤっとしてしまうのが正しいので,この画像は比較的忠実に再現していることになる。

GameWorks Ray Tracingのデノイザを適用した画像
Unreal Engine

 なお,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」と呼ぶこともあるのだが,基本的には同じものである。

 まずは,基本となる「バイラテラルフィルタ」について説明しておこう。
 ぼかし処理とは,あるピクセルの値(色)を,ピクセルの周囲にスプレーをかけるように拡散(平滑化)するような処理である。ぼかし処理で身近なものと言えば,画像編集ソフトなどで採用事例が多い「ガウスフィルタ」だろう。
 ガウスフィルタは,処理対象のピクセルに近いピクセルほど大きな重みを与えて,現状の色を保持する傾向が強くなり,処理対象のピクセルから遠いほど色を保持する傾向が弱まり,色を保持しなくなるような色拡散を行う処理系だ。ただ,ガウスフィルタによるぼかしは,ノイズを周囲に広げはするものの,できあがった画像は,輪郭がぼやけたような見映えになってしまう。

ガウスフィルタの適用例。左が元画像で,中央が「偏差σ=16」を適用した状態,右が「偏差σ=64」を適用した状態だ。シリコンスタジオ製ミドルウェア「YEBIS」のサンプル画像より引用
Unreal Engine Unreal Engine Unreal Engine

 そこでバイラテラルフィルタの出番だ。バイラテラルフィルタの基本概念は,ガウスフィルタと変わらない。ただ,色拡散のアルゴリズムを処理対象ピクセルからの距離だけでなく,隣接するピクセル同士の輝度差(≒色の差異)も考慮するのがポイントだ。輝度差が大きい部分には,色拡散処理を抑制するアルゴリズムをガウスフィルタに加えたようなイメージである。
 ただ,フィルタを適用する全ピクセルを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が公開した画像をもとに,影デノイザによる処理の流れを見ていこう。
 下に並べた画像は,左側が多数のレイを飛ばすレイトレーシングで影を生成したもので,右側は,一般的なデプスシャドウ技法(シャドウマップ技法)による影を生成したものである。影デノイザによるノイズ低減で目指すのは,左側の画像だ。

多数のレイによるレイトレーシングした影(左)と,デプスシャドウ技法により生成した影(右)
Unreal Engine Unreal Engine

 まず,1ピクセルあたり1本のレイによるレイトレーシングで影を作成してみると,当然ながらノイズまみれの影になる。

1本のレイで生成したノイズまみれの影。スライドにある「1spp」とは「1 sample per pixel」(ピクセルあたり1サンプル)の意味だ
Unreal Engine

 これに影デノイザを適用した結果が,以下の画像だ。オブジェクトから影までの距離が短いところは,ちゃんと鮮明な影となっているのが分かるだろう。デプスシャドウ技法による影と比べれば,どちらが多数のレイによるレイトレーシングの結果に近いかは一目瞭然だ。

影デノイザでノイズを低減した結果
Unreal Engine

 影デノイザは,先述のバイラテラルフィルタをさらに拡張した「クロスバイラテラルフィルタ」を使用している。クロスバイラテラルフィルタとは,ぼかし処理を行うときに,処理対象そのものの画像とは別の画像も参照してぼかしのかけ具合を調整するという拡張版バイラテラルフィルタである。
 クロスバイラテラルフィルタの事例としてよく挙げられるのが,MicrosoftがSIGGRAPH 2004で発表した論文「Digital Photography with Flash and No-Flash Image Pairs」(関連リンク)である。この論文で説明された手法は,暗がりで撮影したノイズを多く含むデジタル写真からバイラテラルフィルタを使ってノイズを除去するのだが,フィルタ適用時に参照する追加の画像として,同時に同じ画角で,フラッシュを焚いて撮影した写真も使うというものだ。
 フラッシュ撮影した写真は明るさが一様になってしまうが,ノイズ低減の参考とすることで,ノイズだらけの写真から色味やディテールを崩すことなく,ノイズだけを低減できるのである。以下に掲載したサンプル画像を見ると,その効果は一目瞭然だろう。

中央がクロスバイラテラルフィルタをかける前の写真で,左が追加で参照するフラッシュ撮影した写真,そして右がノイズ低減後の写真だ。色味や輪郭を壊すことなく,ノイズをうまく減らせているのが分かる。「Digital Photography with Flash and No-Flash Image Pairs」の論文より引用
Unreal Engine

 簡単に言うと,ガウスフィルタをバイラテラルフィルタに拡張するときに導入した隣接するピクセル同士の輝度差を考慮する適応型の処理を,別の画像も参照して処理する拡張実装と言えようか。

 影デノイザでクロスバイラテラルフィルタをどう使うかの話に戻ろう。影デノイザで参照する追加のパラメータには,

  • レイが遮蔽物に到達するまでの距離
  • 深度情報(デプス)
  • 処理対象ピクセルの法線ベクトル
  • 光源ベクトル
  • 光源の大きさ

などが挙げられている。
 これらのパラメータによって,レイが遮蔽物に到達するまでの距離が長かったり,光源の大きさが大きかったりする場合は,ぼけ具合を強くするといった具合に,クロスバイラテラルフィルタによる適応型の処理を行うのだ。

 デノイザとは言うものの,実際の影デノイザはノイズだらけの影にぼかしをかけるものではなく,「処理対象のピクセルを,オブジェクトがどのくらい遮蔽しているか」という遮蔽率を計算するものだと,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オブジェクトと背景の境界付近は,凹んで遮蔽されていると誤判断してしまいがちなのだ。

Project Spotlightの映像に対して,SSAOをかけたサンプル。ストームトルーパーの輪郭を囲むような黒い影が,SSAOで描画したものだ
Unreal Engine

 また,キャラクターが動いた場合は,深度バッファの内容も大きく変化するため,凹みも連動して変化する。そうなると,陰影が時間方向に安定していないように見えるのだ。SSAOは,静止画として見ると説得力のあるきれいな映像に見えるのだが,動いているゲーム画面では,不安定に見えることがよくあるのはそのためである。
 そこで,Project Spotlightでは,SSAOを使わずに,レイトレーシングでAOを生成することにした。

 一般的なレイトレーシングによるAO生成は,対象のピクセルから放射状にたくさんのレイを投げて,レイのうち何割が遮蔽物となるオブジェクトに衝突したかを求めて,その割合に応じて影を付けていく。多くのレイが遮蔽されているほど濃い影色になるし,少数のレイしか遮蔽されていなければ,影は薄くなる。アルゴリズム的には,先述した面光源からの影生成と似ていると言えようか。

レイトレーシングによるAO生成の概念図。レンダリング対象ピクセル「p」から半球状に無数のレイをキャストし,その何割が遮蔽物に遮られたかを調べる。そして,その遮蔽率をもとにして影を付ける。ちなみに,図中の「dmax」は,レイの探査半径だ。AOは局所的な影なので,レイの探査範囲は対象ピクセルから近い範囲までとするのが一般的である
Unreal Engine

 さて,NVIDIAのGWRTデノイザは,このレイトレーシングAOを最適化した機能を用意している。それが本稿で言うAOデノイザだ。基本的なアイデアは,影デノイザと同じで,クロスバイラテラルフィルタを活用するという
 AOデノイザでは,投げたレイが影を作っているオブジェクトに衝突するまでの距離が長ければ長いほど,ぼかし半径を広くするという方針でクロスバイラテラルフィルタを使用する。これにより,開けた空間ではぼかし半径が広くなるので淡い影になり,オブジェクト同士が隣接するような部分ではぼかし半径が狭くなるので濃い影ができるというわけだ。

 サンプル画像でAOデノイザの効果を見ていこう。
 今回も多数のレイで生成したレイトレーシングAOの結果を左に,SSAOを用いたレンダリング結果を右に並べてみた。レイトレーシングAOの画像は,輪郭の不自然な影がない。一方でSSAOの画像は,凹みの影こそ説得力があるものの,オブジェクトの輪郭全体に影がついた不自然さがある。

レイトレーシングAOによるレンダリング結果(左)と,SSAOによるレンダリング結果(右)
Unreal Engine Unreal Engine

 次に示した画像は,2本のレイだけで生成したレイトレーシングAOの例だ。見てのとおり,ノイズがひどい。

2本のレイだけで生成したレイトレーシングAO
Unreal Engine

 最後に示した画像が,2本のレイで生成したレイトレーシングAOに対して,AOデノイザを適用したものとなる。オブジェクトが接地している部分に濃いめの影が付くのが特徴だ。「環境光で生成した影」という点では,こちらの方が説得力が高い画像と言えよう。

2本のレイで生成したレイトレーシングAOにAOデノイザをかけたもの
Unreal Engine

 リアルタイムレンダリングを実現するためには,大量のレイは投げられない。そこで,開発チームが実験を重ねて検討したところ,フルHD解像度におけるレイトレーシングAO生成では,1ピクセルあたり,16本のレイを放射状にキャストすると,それなりに納得できるAOが得られるようになったという。

 しかし,現状のGPU性能では,1ピクセルから16本ものレイを一度にキャストするレイトレーシングをリアルタイムで実行できない。そこでProject Spotlightでは,1フレームあたり2本のレイをキャストすることにして,その後は8フレームにわたって1フレームごとにレイの方角を変えてキャストすることで,局所的な遮蔽率を求めたという。つまり,1フレームあたり2本,8フレーム分で計16レイのレイトレーシングAOを生成するわけだ。

2本のレイだけでレイレトレーシングした場合のAO。かなりノイジーだ
Unreal Engine

先の映像にAOデノイザを適用してノイズを低減したサンプル。AOの効果はいまいち弱く,奥側に立つストームトルーパーの首回りには,ノイズが見えている。1ピクセルあたり2本のレイしかキャストしていないことに原因がありそうだ
Unreal Engine

 複数フレームにわたり,少数のレイを投げてレイトレーシングを行い,必要なだけの情報が集まったらAO生成に必要な遮蔽率を計算するというのは,一見うまくいきそうだが,これは映像が静止している場合にしか成り立たない。視点が動いてしまえば映像も動くし,キャラクターが動いても同様だ。

 映像が動くことに対処するために,Project Spotlightでは「モーションバッファ」を利用した。ここで言うモーションバッファ(≒ベロシティバッファ)とは,時間方向のアンチエイリアス処理である「Temporal Anti-Aliasing」で使うもので,フレーム内の各ピクセルが過去フレームのどこと対応するかを表すバッファである。これをレイトレーシングAOに使ったというのだ。
 つまり,過去7フレーム分にわたるAOの計算結果とモーションバッファを照らし合わせたうえで,現在描画中のフレームにおけるAOの計算結果と組み合わせることで,最終的な遮蔽率を割り出すわけである。

レイの方向を変えながら,8フレーム分で計16本のレイをキャストして遮蔽率を求めたAOのサンプル。ストームトルーパーの首周りに見えていたノイズは消えている
Unreal Engine

 とはいえ,カメラのアングルががらりと変わったり,シーンが切り替わったりした場合,過去7フレーム分の情報は役に立たない。事実上の消失だ。そんなときはどうするのか。

シーンが切り替わった直後,もし,過去7フレーム分+現在のフレームによる遮蔽率をもとにした小さなぼかし半径でAOデノイザをかけると,このようなまだらになってしまう
Unreal Engine

 この場合は,GWRTデノイザのぼかし半径を増大させて,正確ではないが淡いAOとして生成することで,ノイズをそれなりに隠蔽するようにしたという。AOは淡くても見た目に支障はないものだし,さらに8フレーム分の時間が経過すれば,設計通りのAO効果が得られるので,気にしないことにしたようだ。

シーンが切り替わった直後に,AOデノイザのぼかし半径をやや広めにしてぼかしをかけた状態。出だしがこれで,8フレーム後には想定通りのAOに落ち着くのであれば,そこは妥協することにしたようだ
Unreal Engine


リフレクションの生成こそレイトレーシングの真骨頂


 GWRTデノイザの3つめである,リフレクションデノイザについて説明しよう。
 Epic GamesやNVIDIAは,レイトレーシングパイプラインにおける最大の見どころは,リフレクションにあると主張する。ここで言うリフレションとは,鏡面反射によって生じる映り込み,いわゆる鏡像のことだ。Project Spotlightでは,ストームトルーパーの指揮官「キャプテン・ファズマ」が身につけている銀ピカのアーマーや,テカテカの床などに,その分かりやすい効果が見られる。

Project Spotlightにおけるキャプテン・ファズマのコスチュームには,周囲の情景だけでなく,自分自身のアーマーが別の部位に映り込むセルフリフレクションのような鏡像が表現されている
Unreal Engine

 リフレクション効果は,これまでのゲームグラフィックスでも使われていたが,そのアプローチは疑似的なものが主流だった。
 たとえば,初代PlayStation時代の初期は,アーティストが描いた「それっぽい映り込み像」を描いた環境マップテクスチャを,適当にスクロールさせながら3Dモデルに適用する程度のものだった。それがPlayStation 2〜PlayStation 3時代(DirectX 9世代)になると,全方位の情景を事前にレンダリングしたキューブ環境マップとして生成しておき,これを視差補正しつつ3Dモデルに適用する手法が確立した。

 キューブ環境マップは事前生成するものなので,背景が破壊されたり,キャラクターが動き回ったりする動的なシーンを正確に反映することはできないという欠点がある。そこで,動的なシーンにも対応できる映り込み表現として考案されたのが,レンダリング結果フレームを鏡像の素材にして,画面座標系の局所レイトレーシングで鏡像を生成する「Screen Space Reflection」(SSR,Realtime Local Reflectionとも)だ。
 現在のゲームグラフィックスにおけるリフレクションは,大局的な鏡像をキューブ環境マップで,局所的な鏡像はSSRで表現するのが主流と言えよう。

 ただ,SSRにも問題点はある。レンダリング結果フレームをもとに鏡像を生成するので,画面外にある情景を映り込ませることができないのだ。鏡像のもとになっているものが画面外に消えると,対応する鏡像も消失するという不自然な状況が起こりうる。画面外の情景による鏡像は,静的なキューブ環境マップで対応するのだが,最悪の場合,動的キャラクタが画面外に消えると,その鏡像も途中で消えてしまい,消えたあたりからキューブ環境マップに移行するので,境界線のようなものが見えてしまうこともあるのだ。

SSRで生成した鏡像。床下に映るキャラクターの鏡像が歪んで見える。本来なら床下から見上げるような情景になるはずだが,レンダリング結果フレームをベースにして作ると,不自然な鏡像となることもあるのだ
Unreal Engine

同一シーンの鏡像をレイトレーシングで生成したサンプル。床下に映る鏡像は歪んでいない。床に「面の粗さ」が存在するため,影と同じく投影距離の短い鏡像はくっきりと,投影距離の長い鏡像はぼやけている。それに加えて,画面外にある天井の情景が,オブジェクトに映り込んでいる点にも注目したい
Unreal Engine

 こうした不自然さを解消できるレイトレーシングによる鏡像生成には,高い価値があるというのが,Epic GamesとNVIDIAの主張である。

 さて,Project Spotlightにおいて,RTXによるレイトレーシングでリフレクションを生成するときには,1ピクセルあたり2本のレイをキャストしているという。しかも,各レイは2回までバウンス(反射)することにしたそうだ。ここでいうバウンスとは,レンダリング対象ピクセルから視線の反射方向に投げたレイが,遮蔽物となるオブジェクトに衝突した場合,その衝突地点から反射する方向にレイを飛ばすことをいう。つまり2バウンスとは,レイの反射を2回行うという意味となる。
 手鏡を持って鏡台の前に立つキャラクターを描画する例で考えてみよう。2回までレイがバウンスすると,鏡台にはキャラクターの鏡像だけでなく,キャラクターが持つ手鏡に写った部屋の情景も,鏡台に写る鏡像として描くことが可能になるわけだ。

 現実世界の光はバウンス数が無限大であるので,計算するバウンス数が多いほど写実的な映像になるが,当然ながら計算量が増えて重くなる。そこでProject Spotlightでは,バウンス数を2回に設定したわけだが,これでさえも,Epic GamesやNVIDIAに言わせればやや重すぎたらしく,反省材料にしているという。実際のProject Spotlightにおいても,計算量の増加をカバーすべく,特別な最適化を2つ加えたそうだ。

40バウンスまで対応した実験的な画像。合わせ鏡的なテストショットになった
Unreal Engine

 最適化の1つめは,リフレクション生成用のレイトレーシングにおいて,3Dシーンの材質表現を非常に簡略化したこと。
 Project Spotlightでメインとなる直接光によるライティングは,UE4のグラフィックスエンジンが採用した,Deferred Rendering(ディファードレンダリング)ベースの物理ベースレンダリングで行っている。通常のライティングなら,UE4のエディタで定義したかなり複雑な材質再現反射特性を使って物理ベースレンダリングを行うのだが,リフレクション生成用のレイトレーシングに使うときには,簡略化したパラメータに置き換えて処理しているそうだ。

 最適化の2つめは,ザラザラとした粗い面にレイが衝突した場合には,そこにはもう鏡像ができにくいと見なして,2バウンスめのレイを投げないという手法である。先述した手鏡を持ったキャラクターの例で言うと,手鏡ではなくふわふわしたぬいぐるみを持っているなら,ぬいぐるみの表面には鏡像が生じないので,2バウンスめのレイは投げないという具合である。

 さて,鏡のようなツルツルした材質であれば,くっきりとした鏡像が出るが,自然界や日常で目にする材質は,そこまでツルツルとしたものは多くないだろう。大抵の物体は,表面がそれなりにザラザラとしているわけで,こうしたざらつきは,材質パラメータのラフネスで表す。
 レンダリング対象のピクセルにおけるラフネスが大きいと,そこはザラザラしていると判断できる。そのような材質の面は,隣接しているピクセル同士の視線方向に反射ベクトルがばらつくはずだ。つまり,拡散反射に近い反射特性となるわけで,たかだか2本のレイによるレイトレーシングでは,ノイズまみれのリフレクションとなってしまう。そこで登場するのがリフレクションデノイザだ。

 下に並べた画像は,「面の粗さ=0.18」(※値が小さいほどツルツルしている)の床面にレイを投げるレイトレーシングによってリフレクションを生成した画像だが,左は1ピクセルあたり多数のレイを投げているのに対して,右は1ピクセルあたり1本しか投げていない。レイが1本の画像は,見てのとおりノイズだらけだ。

1ピクセルあたり多数のレイを投げてリフレクションを生成した画像(左)。右は1ピクセルあたり1本のレイしか使っていない画像だ
Unreal Engine Unreal Engine

 これの素材を使い,リフレクションデノイザを使ってノイズを低減したものが下の画像となる。ノイズが驚くほど低減されたのが分かるだろう。

1ピクセルあたり1本のレイでリフレクションを生成した画像に,リフレクションデノイザをかけた状態
Unreal Engine

 影デノイザやAOデノイザと同様に,リフレクションデノイザも,クロスバイラテラルフィルタをベースにした技術である。リフレクションデノイザにおけるクロスバイラテラルフィルタは,材質パラメータのラフネスが大きいほど,ぼかし半径を広くする方針で動作しているそうだ。ただし,ぼかし半径の制御には,レンダリング対象ピクセルの位置が視点から遠ければ遠いほど,ぼかし半径は狭くする処理を加えて,不自然に見えないようにもしているとのことだった。


リアルタイムグラフィックスに適したGWRTデノイザ

NVIDIA製GPU以外への応用もあり得る


 ここまでで3種類のデノイザを説明してきたわけだが,簡単にまとめると,GWRTデノイザとは,基本的にクロスバイラテラルフィルタである。そして,何を生成するためにレイトレーシングを活用するのかという用途に応じて,クロスバイラテラルフィルタの動作を規定するパラメータを変更し,用途別にGWRTデノイザの動作を最適化したものが,影デノイザやAOデノイザ,リフレクションデノイザであると理解すれば分かりやすい。
 GWRTデノイザの根幹技術は,バイラテラルフィルタであり,現状のGPUでも比較的高速化しやすいため,リアルタイム性に優れる手法と言える。少なくとも,機械学習ベースのAIデノイザよりはゲームグラフィックス向きと言えるだろう。
 また,AIデノイザとは異なり,Volta世代GPUにしかないTensor Coreも使っていないので,汎用性にも優れる。それこそ,NVIDIA以外のGPUでの実装も容易だと思われる。

 一方で,現在のGWRTデノイザには,大きく分けて3つの制限もあるという。
 1つは影デノイザの仕様で,複数の面光源が複数の影を生成した場合,影が重なる部分の品質がやや劣ることだそうだ。もう1つは,キャストするレイの数を多くしないと,AOデノイザでは良い結果が得られないこと。そしてリフレクションデノイザにも,ラフネス値が上がる(面の粗さが増す)と品質が下がることだそうだ。

GWRTデノイザにおける3つの制限
Unreal Engine


Project SpotlightにGPU進化の夢を見た


 実際には導入されなかったそうなので,本稿では詳しく触れないが,Project Spotlightでは,RTXによるレイトレーシングを使って,リアルタイムの間接光表現などの実装も試みたそうだ。しかし,3種類のデノイザを処理するとGPU性能に余裕がなかったそうで,実験的な実装だけに留めて,Project Spotlightへの組み込みは見送ったそうだ。
 そのため,Project Spotlightにおける間接光表現は,本稿で解説したレイトレーシングベースのAOやリフレクション以外には,UE4の標準機能である事前計算ベースの間接光表現機能「Lightmass」を使うに留めたという。

レイトレーシングを使い,リアルタイムの間接光表現などの実装も試みたが,処理負荷が高すぎたために,Project Spotlightデモでは採用を見送った
Unreal Engine

 Project Spotlightは,15万ドルもするDGX Stationでしか動作しないのだが,Epic GamesとNVIDIAは,開発に取りかかった当初では,GV100ベースのグラフィックスカードであるNVIDIA TITAN V」(以下,TITAN V)を1枚搭載したPCで,リアルタイム動作できることを目指していたのだそうだ。ところが蓋を開けてみると,TITAN Vでは1フレームあたりの総処理時間が約140msにもなってしまい,約7fps程度が限界となることが判明してしまう。そこで,しかたなくGV100を4基搭載するDGX Stationに実行環境を移行したという話だった。

 なお,現行のUE4はDirectX 12に対応しているものの,PCが搭載するGPUを個別に駆動させる「Multi Display Adapter」(MDA)モードには対応していない。そこで,MDAモードにも急遽対応を図ったとのことだ。UE4のMDAモード正式対応は,UE 4.20か,その次となるUE 4.21となるようだ。

現状のUE4は,MDAモード(スライドではmGPU)に対応していない。UE 4.20か4.21で実装予定とのこと
Unreal Engine

 結局Project Spotlightでは,4基のGPUのうち1基をメインGPUとして,ほか3基はほぼレイトレーシング専用の「Helper GPU」として利用する実装とすることで,なんとか目的の24fpsを達成できたとのこと。つまり,1フレーム生成するのに140msかかっていた処理を,GPUを4基使うことで,3倍以上速い約42msまで短縮できたわけだ。

4基のGPUをどう使い分けたのかを示したスライド。ゲームグラフィックスにおけるマルチGPU活用でお馴染みの,SFRとAFRの複合メソッドを採用したとのこと。レイトレーシング専用の「Helper GPU」でラスタライズ法(Raster)による通常のレンダリングを行っている部分は,まさにSFRやAFRのレンダリングを行っているところだ
Unreal Engine

 そろそろまとめに入ろう。
 面光源ライティングと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:
4Gamer.net最新情報
プラットフォーム別新着記事
総合新着記事
企画記事
トピックス
スペシャルコンテンツ
注目記事ランキング
集計:08月16日〜08月17日
タイトル評価ランキング
81
KENGOHAZARD2 (PC)
76
Days Gone (PS4)
76
55
DEAD OR ALIVE 6 (PS4)
53
Anthem (PC)
2019年02月〜2019年08月