NVIDIAは2日、今後の3Dゲームで、リアルなグラフィックス表現のために特に重要と見込まれている技術、リアルタイム・グローバルイルミネーション技術について紹介する記者説明会を開催した。Epic Gamesの協力により、同技術を実装した次世代ゲームエンジン「Unreal Engine 4」の解説/デモンストレーションも行われた。リアルタイム・グローバルイルミネーション技術が、いよいよ普及の端緒につく。

NVIDIAのデベロッパーテクノロジーエンジニア 竹重雅也氏が最新のグローバルイルミネーション技術を解説

最新のグローバルイルミネーション技術

グローバルイルミネーションとは、ひとことで言えば「光」の表現のなかで、「直接光」だけでなく、それを物体が反射するなどした「間接光」を考慮するものだ。しかしながら、その計算量は膨大で、とても"重い"計算になってしまうため、現在のゲームグラフィックスのほとんどは、基本的にはこれを考慮していないものになっていることが多い。しかし、現在のところは実装ハードルが高いとはいえ、間接光の表現の有る無しは、描画されたゲームグラフィックスのリアリティを大きく左右するものであるため、極端な話だとアーティストが多大な労力をかけてそれっぽい絵を描いて、疑似的にこれを表現するといったことまでしていた。

グローバルイルミネーションとは間接光を表現するもの。現実世界ではあたりまえの現象だが、これをコンピュータグラフィックスでリアルタイム処理して表現するのは、計算量が膨大になってしまうため困難だった

このグローバルイルミネーション技術の最新の状況について、NVIDIAのデベロッパーテクノロジーエンジニア 竹重雅也氏が解説してくれた。そのグローバルイルミネーションを、GPUの高い処理能力を利用して、リアルタイムにレンダリングしてしまおうというのが、最新の考え方になっているという。

最新の手法の前に、現在までに使われていたグローバルイルミネーションの手法のひとつとして、「FEM」(ラジオシティ)が説明された。これは、オブジェクト(ゲーム内の物体)の、光源からの光が当たる平面を位置毎にいくつかに分け、その位置毎に光が当たった際の光の伝播具合を事前に計算しておく。そこに当たる直接光と間接光伝播のみをリアルタイム計算することで、グローバルイルミネーションをリアルタイムに表現していた。ただ、オブジェクトの位置毎に事前計算しているということは、位置が動くオブジェクト(代表的な例としてはキャラクターなど)への対応は制限されざるをえない手法となる。

続いて、2010年に、「Light Propagation Volume」という手法が登場した。2次元の画素単位であるPixelに対し、立体的な3次元の画素単位であるVoxelと呼ばれる単位がある。この手法は、このVoxelに光を当てた際、そのVoxelが隣接するVoxelにはどのように光を伝播するのかだけを都度計算することで負荷を抑え、リアルタイムにグローバルイルミネーションを処理できるようにしたもの。一方で、Voxelの解像度の増加が負荷を乗数で上げてしまったり、Voxelが隣接Voxelへ、さらにその隣接Voxelへとしていくことで、もともとの光の方向がどんどんあいまいになってしまうというデメリットもあった。

Voxelが隣接するVoxelにはどのように光を伝播するのかを都度計算する「Light Propagation Volume」手法

PixelとVoxel

そこで、それらの課題に対処し、最新のリアルタイム・グローバルイルミネーション技術が、NVIDIAの2011年の論文である「Interactive Indirect Illumination Using Voxel Cone Tracing」で発表された、「Sparse Voxel Octree」という手法だ。Octreeとは「八文木」のことで、Sparce Voxel Octreeでは、3次元空間のデータを、八文木構造を用いて階層化して構築する。言葉だけだとわかりづらいので、以下の図版でも八文木構造を確認いただきたい。

Sparce Voxel Octreeの八文木構造。空間を8分割した八文木にし、その8分割の中も(下の階層も)必要に応じて八文木に……というふうに、ツリー状に階層化していく

この手法でリアルタイム・グローバルイルミネーションを実現するアルゴリズム概要。右側の1.2.3.の順に進む

その際のVoxel構築はすべてGPUで処理しており、Voxel構築の効率を上げるため、中間処理を行わず(まず階層構造のないVoxelをつくってといった無駄はしない)、直接最初から階層化Voxelをつくっている。そして、必要のない空間には細かい階層をつくらない。階層構造のなかで、光源からの光の反射の情報を、最初の階層から順に書き込み、その先の、Octreeで最も細分化された最後の階層の光の反射の情報をもとに、中間階層にの必要な場所にのみVoxel情報を書き込む。

直接光の反射情報をVoxelに書き込み、Octree階層の必要な部分には細分化してVoxel情報を書き込む。必要の無い部分は間引くことで効率を上げている感じ

そして、カメラ視点からレンダリングする際に、複数のrayを飛ばして広範囲を探索するのではなく、コーン(円錐)状の一定の範囲内ごとにrayを探索する。探索を進めるに従いコーンの半径が大きくなり、応じて探索するOctree階層も進む。これでrayの効率よく広範囲の間接光を算出できるようにしている。

カメラ視点からグラフィックスをレンダリングする際のオブジェクトの探索も、複数のrayを飛ばす代わりに、段階的に探索する範囲が変わる円錐状のコーンのような範囲でまとめて広範囲に探索する

なお、Voxelにはジオメトリ情報や、反射の方向や鋭さなどの情報が格納されている。OctreeのVoxelは、階層化と、比較的多めの情報を格納しているため、それ自体を更新するとなるとやはり大きな負荷がかかるものと思われる。そこで、再構築が必要な場合は、シーンの中すべてを再構築するのではなく、変化あった場所だけを再構築して負荷をさげるなどの工夫も行われている。ただ、現行のFerimiやKeplerでもかなりの速度でこの処理はできているそうで、もう少しGPUの世代がすすめば、シーンのすべてのVoxel Octreeを更新しても問題ないレベルになるだろうとも想定しているそうだ。

NVIDIAのリアルタイム・グローバルイルミネーションの技術デモ。左は間接光を考慮しない場合。ひとつの光源(太陽など)から差し込んだ光が、どのオブジェクトにも反射していないため、室内が暗い。右は間接光を考慮した処理をリアルタイムに行っている。カーテンや床に反射した光で、室内が明るくなり、よりリアルなシーンをレンダリングしている。色のついたオブジェクトからの反射光には、ちゃんと色がついている点にも注目

これは、カーテンからの反射光が床に当たっているところを拡大した場面。ここでは、オブジェクトの光の反射の具合を変えることで、床の表面が光を反射しやすいツルツルの大理石のように表現したり(写真左)、逆に表面が光を反射しづらいザラザラな石の質感を表現したり(写真右)と、床の材質の違いの表現も実現している

「Unreal Engine 4」がSparse Voxel Octreeを採用

このSparse Voxel Octreeは、実際にゲームエンジンに実装されている。それが、今年のGDCで発表されたUnreal Engineの最新版、「Unreal Engine 4」だ。当日はエピック・ゲームズ・ジャパンの担当者がこれを紹介してくれた。Unreal Engine 4はデベロッパーに配布が始まっており、最新のハイエンドPCを想定した3Dゲームの開発がすでにスタートしているという。

エピック・ゲームズ・ジャパンの担当者が「Unreal Engine 4」を紹介。中央が代表の河﨑高之氏、左右がサポートチームの下田純也氏(左)とロブ・グレイ氏(右)

「Unreal Engine 4」では、グローバルイルミネーションはじめ、全てで動的にリアルタイムのレンダリングを実行するというコンセプトがある。開発環境でもリアルタイムにというコンセプトを貫き、コードの反映などを即座に行えるため、制作上の待ち時間を減らせるなどのメリットがあるという

Sparse Voxel Octreeを採用したUnreal Engine 4のリアルタイム・グローバルイルミネーションを、GeForce GTX 680とCore i7を搭載したPC上で動作させるデモンストレーションが披露された。なお、このグローバルイルミネーション技術を用いたゲームタイトルの動作環境としては、Fermi世代が技術的に対応できる世代で、快適な動作という観点ではKepler世代のGPUが推奨されるというものだそうだ。

「Unreal Engine 4」のデモ。光源からの光を複雑にリアルに反射した間接光がリアルタイムに表現されている

リアルタイム処理なので、光源の向きを変えたり、光を反射するオブジェクトの材質の表現を変えたりすれば、その結果がシーンに即座に反映される

写真は開発環境の画面。待ち時間なくシーンを確認できるので、いままでのように長時間のレンダリング待ちをする必要がなく、思いついたアイデアをすぐにシーンに反映できるというメリットが

ほか、グローバルイルミネーション以外の部分でも、Unreal Engine 4がUnreal Engine 3から向上した部分として、パーティクルの演算をGPUで処理するようになっていることなどが紹介された。ベクトルをテクスチャに格納することで、多くのパーティクルをGPUで効率よく制御できるようになっており、100万以上のパーティクルをGPU内でリアルタイム演算することも可能になっているという。

これはパーティクルのデモ。多くのパーティクル処理できることで、飛び散る火の粉をリアルに表現している

これは立ち上る煙で、これも多くのパーティクルで表現。よく見ると煙の中には光源としての溶岩の光が、パーティクルの煙に反射している