3Dゲームファンのためのグラフィックス講座

西川善司の3Dゲームファンのための「Panta Rhei」講座(前編)

エミッシブなマテリアルからのライティングに対応

 『deep down』のリアルタイム映像デモでは、ドラゴンから放たれた炎のブレス攻撃が周囲をフワァっと明るくする表現がある。まるで、炎の軌跡に無数の光源を置いたような表現だが、これはどのようなシステムで実践されていたのだろうか。

【『deep down』の火炎ブレス攻撃】
ドラゴンの火炎ブレス攻撃は周囲を明るく照らす。この仕組みは?

清水氏:実は、我々も話題の動的間接照明技術となった「Sparse Voxel Octree Based Real-Time Global Illumination」(SVO-GI)を実装してみたんですよ。ところが、八分木ボクセル化の処理系がどうしても重めで、PS4での積極活用は今回はあきらめたんです。『deep down』では、この時の実装経験を元にして、ボクセルコーントレーシングだけを活用する事にしました。

 SVO-GIは、NVIDIAのCyril Crassin氏が開発したリアルタイム3Dグラフィックス向けの大局照明技術の1つで、その論文はSIGGRAPH2011に
「Interactive Indirect Illumination Using Voxel Cone Tracing: An Insight」として発表されている。このSVO-GIをいち早く実装して自社ゲームエンジンに導入したのがEPIC GAMESの「Unreal Engine 4」だ。

【Unreal Engine 4「Elemental Demo」】
Unreal Engine 4の「Elemental Demo」より。UE4ではSVO-GIによる大局照明技術を実装していた

 SVO-GIでは、まずシーンをGPUでボクセルによって分割して八分木構造を構築する。この際、オブジェクト(ジオメトリ)密度が高い箇所には細かいボクセルが割り当てられ、何もない空間には大きなボクセルが割り当てられていく。続いて、そのシーンを直接光によって普通にライティングし、その結果を八分木構造化した最も末端の枝(えだ)の小さいサイズのボクセルに注入し、今度はそのライティング結果を幹(みき)側の大きいボクセルに反映集約させる処理を実践する。つまり、各ボクセルには直接光からの照明結果が格納されていることになるが、大きい親ボクセルには子ボクセルの情報を集めてきたようなMIP-MAP構造ができあがる。

【メタシェーダーシステム】
八分木構造を用いて、シーンを疎密なボクセルに割り当てることがSVO-GI法の根幹テクニックだった
直接光によるライティング結果を末端ボクセルに注入して、親階層ボクセルに結果を集めていく処理を実践。これにより間接光情報が疎密なボクセルに伝搬したことに相当する

 最終的なレンダリング時には、着目しているピクセルからレイトレーシング的なアプローチで、レイを飛ばし、この八分木構造となったボクセルを探索(トラバース)し、前段処理でボクセル側に集められた直接光の照明情報を集めてきる処理を行なう。着目しているピクセルから全方位のボクセルに対してレイをトラバースすれば、拡散反射の間接照明情報を集めてきたことになり、視線に対する反射ベクトルに沿った形でトラバースを行なえば鏡面反射の間接照明情報を集めてきたことになる。

 この時のトラバースさせるレイについては、レイトレーシングのように複数のレイを飛ばすのではなく、錐体(コーン)状に、距離を進むごとに探索半径を大きくするようにして行なう。だからこの手法は「ボクセル・コーン・トレーシング」と呼ばれるわけだ。

【ボクセル・コーン・トレーシング】
「レイは錐状に広がる」としてトラバースする。実際にはトラバースしていくにしたがって大きいボクセルからの間接照明情報を参照することで代行している

 この手法のポイントは、3Dオブジェクトが何もない開けた空間に対しては、八分木構造化したことで、大きなボクセルが割り当てられているため、レイのトラバースを一気に進められる。つまり、大きなシーンに対しても効率よく間接照明が実践できるというわけだ。より詳細な解説については
本連載「Unreal Engine4編」NVIDIAの技術説明会解説編を参照して頂きたい。

三嶋氏:「SVO-GIの八分木ボクセル構造生成のところは重いが、ボクセルコーントレーシングの仕組みは結構使えるかも」ということになりまして、発光体(エミッシブ・マテリアル)の表現に効果的に使うことを思いついて実践することにしました。『deep down』でいうと、それがまさにドラゴンの吐く火炎攻撃の表現のところです。

【UE4/Elemental Demoにおける発光体表現】
UE4の「Elemental Demo」より。UE4でもSVO-GIの仕組みを流用して発光体の表現を実践していた

 結局、シーンを動的に八分木ボクセル構造化するのはあきらめ、シーンを最大で64×64×64ボクセル程度の固定数ボクセルで分割することにして、実装としてはリスト構造ではなく、3Dテクスチャ(ボリュームテクスチャ)の形で実装したのだった。さらに同一空間を32×32×32ボクセル、16×16×16ボクセルでも表すようにして、いわばMIP-MAPの概念を導入している。『deep down』では、この3Dテクスチャで表したボクセル構造に対して、火炎の炎色を入力させている。

三嶋氏:『deep down』では、数十メートル四方のシーンをこのボクセル構造に割り当てていて、64×64×64ボクセルだと大体一辺が50cm前後程度になります。これは、あとでお話しする流体シミュレーション(詳細については後編で紹介する)用のグリッドサイズよりもだいぶ粗いものになっています。発光表現のためのボクセルサイズを、シミュレーション用のグリッドサイズほど細かくする必要はありませんからね。

 実際のレンダリングは、SVO-GIとほぼ同じアプローチで実践される。着目しているピクセルから拡散反射ならば全方位にレイをトラバースさせ、鏡面反射ならば視線ベクトルに対する反射ベクトルでレイをトラバースさせる。そのレイのトライバースのさせ方はもちろんボクセルコーントレーシングとなる。SVO-GIのように八分木構造を辿るのではなく、3Dテクスチャを参照することになるのだが、視点から近い位置では64×64×64ボクセルの高解像度ボクセルを参照し、視点から離れるに従って低解像度ボクセルを参照するようにしている。

 鏡面反射の場合は1方向にレイをトラバースさせるだけでよいので、全ピクセルがかならず視線に対しての反射ベクトル方向にレイを放っている。しかし、拡散反射の場合は、全方位にレイをトラバースさせる必要がある。さすがに膨大なレイを放つのには無理があるので、『deep down』の際には、あらかじめワールド座標系で規定しておいた12方向(正十二面体の重心位置から12頂点へ放つイメージ)に放つことにしたとのこと。

清水氏:ただ、それでも、各ピクセルごとに12方向にレイを放つのは、パフォーマンス的にやや重すぎると言うことで、4×3(=合計12ピクセル)ピクセルからなる基準タイルを想定して、そこから1方向ずつ、合計で12方向のレイをトラバースさせるインターリーブサンプリング法を採用することにしました。

 つまり、各ピクセルからは1方向にしかレイを放たないわけだ。このままでは荒すぎるので、近傍2×2タイル分の深度値が近いものから重み付けをして、各ピクセルから12方向にレイを放ったような結果になるように算術的な合成処理を行なっている。

【3Dテクスチャを可視化したショット】
『deep down』ではシーンを64×64×64の3Dテクスチャを用いて、ソリッドなボクセル構造に分割。このショットは、その64×64×64の3Dテクスチャの数枚を抜粋して可視化させたもの。中央の赤やオレンジのテクセルは、発光体としての炎色の情報が注入された結果だ

【インターリーブサンプリング】
インターリーブサンプリング実施直後の結果を可視化した映像。1ピクセル1方向にしかレイを飛ばしていない結果
周囲12ピクセルの情報を用いて、当該ピクセルの12方向の照明情報を推測復元させた結果がこちら

 今回は、この3Dテクスチャベースで行なったシーンのボクセル分割化とボクセルコーントレーシングは発光体からのライティングにしか活用していないが、ボクセルに直接光のライティング結果を入れ込めば、間接照明(大局照明)を実践することは可能なはずだ。

清水氏:間接照明は、ちゃんとやろうとすると3Dテクスチャベースで行なうシーンのボクセル化の解像度を上げていく必要があると思います。ただ、それにはメモリが潤沢なPS4といえども敷居の高いことになりそうです。ただ、打開作がないわけでもないんですよ。PS4のGPUであるGCN(Graphics Core Next)世代のRADEONでは、Partially Resident Texturesというテクニックが使えるので、広大なシーンを巨大な3Dテクスチャでボクセル化して、視点から近いシーンの3Dテクスチャだけをオンメモリにするというような処理系が実現できるんです。

 「Partially Resident Textures」とは、「Virtual Texture」と呼ばれたり、OpenGL系ではAMD拡張仕様の「AMD_sparse_texture 」と呼ばれたりするテクニックで、簡単に言えば、仮想メモリの概念をテクスチャに適用するようなアイディアだ。テクスチャストリーミングのような考え方とも言え、近年のゲームタイトルではid softwareの「Rage」が「Mega Texture」テクノロジーとして自前でソフトウェア実装していた。Partially Resident Texturesは、これをハードウェア支援で実装するもので、実はPS4とXbox Oneから利用することができることがわかっている。

 Microsoftが6月末に開催した開発者向けイベント「BUILD 2013」にてDirectX 11.2が発表されたが、このDirectX 11.2において、「DirectX tiled resources」という新機能が実装される。このDirectX tiled resourcesとは、まさにPartially Resident Texturesを一般化したものに他ならない。

 Partially Resident Texturesを利用すれば、八分木ボクセル化の処理をしなくても広大なシーンをかなりの解像度を持った3Dテクスチャーを用いてボクセルに割り当てることは確かにできそうだ。これが実現できたときには、現在の「Panta Rhei」の手法でも、間接照明などを実用レベルで実践できる可能性はある。実際、開発チームはこの仕組みの実装にむけての技術検討を行なっているようだ。

【『deep down』のグラフィックスの要素分解ショット】
アルベド
焼き込み済みの遮蔽率
画面座標系遮蔽率(SSAO)
ボクセルコーントレーシングを用いて求めた拡散反射
ボクセルコーントレーシングを用いて求めた鏡面反射
流体からの発光を配慮しない最終映像(参考)

最終映像

伊集院氏:「Panta Rhei」は開発進捗度で言えばまだまだ途中段階で、『deep down』開発チームからの要望を取り入れながら日々進化している段階です。まだまだお話しできない要素もたくさんありますので、そうしたトピックについては順次、情報を公開していきたいと思っています。

 後編では、ゲームエンジン向けに実装した事例としては世界的に見ても珍しい、「Panta Rhei」の「流体シミュレーション」エンジン部の話題をお届けする。

(トライゼット西川善司)