NVIDIAは2日、今後の3Dゲームで、リアルなグラフィックス表現のために特に重要と見込まれている技術、リアルタイム・グローバルイルミネーション技術について紹介する記者説明会を開催した。Epic Gamesの協力により、同技術を実装した次世代ゲームエンジン「Unreal Engine 4」の解説/デモンストレーションも行われた。リアルタイム・グローバルイルミネーション技術が、いよいよ普及の端緒につく。
最新のグローバルイルミネーション技術
グローバルイルミネーションとは、ひとことで言えば「光」の表現のなかで、「直接光」だけでなく、それを物体が反射するなどした「間接光」を考慮するものだ。しかしながら、その計算量は膨大で、とても"重い"計算になってしまうため、現在のゲームグラフィックスのほとんどは、基本的にはこれを考慮していないものになっていることが多い。しかし、現在のところは実装ハードルが高いとはいえ、間接光の表現の有る無しは、描画されたゲームグラフィックスのリアリティを大きく左右するものであるため、極端な話だとアーティストが多大な労力をかけてそれっぽい絵を描いて、疑似的にこれを表現するといったことまでしていた。
このグローバルイルミネーション技術の最新の状況について、NVIDIAのデベロッパーテクノロジーエンジニア 竹重雅也氏が解説してくれた。そのグローバルイルミネーションを、GPUの高い処理能力を利用して、リアルタイムにレンダリングしてしまおうというのが、最新の考え方になっているという。
最新の手法の前に、現在までに使われていたグローバルイルミネーションの手法のひとつとして、「FEM」(ラジオシティ)が説明された。これは、オブジェクト(ゲーム内の物体)の、光源からの光が当たる平面を位置毎にいくつかに分け、その位置毎に光が当たった際の光の伝播具合を事前に計算しておく。そこに当たる直接光と間接光伝播のみをリアルタイム計算することで、グローバルイルミネーションをリアルタイムに表現していた。ただ、オブジェクトの位置毎に事前計算しているということは、位置が動くオブジェクト(代表的な例としてはキャラクターなど)への対応は制限されざるをえない手法となる。
続いて、2010年に、「Light Propagation Volume」という手法が登場した。2次元の画素単位であるPixelに対し、立体的な3次元の画素単位であるVoxelと呼ばれる単位がある。この手法は、このVoxelに光を当てた際、そのVoxelが隣接するVoxelにはどのように光を伝播するのかだけを都度計算することで負荷を抑え、リアルタイムにグローバルイルミネーションを処理できるようにしたもの。一方で、Voxelの解像度の増加が負荷を乗数で上げてしまったり、Voxelが隣接Voxelへ、さらにその隣接Voxelへとしていくことで、もともとの光の方向がどんどんあいまいになってしまうというデメリットもあった。
そこで、それらの課題に対処し、最新のリアルタイム・グローバルイルミネーション技術が、NVIDIAの2011年の論文である「Interactive Indirect Illumination Using Voxel Cone Tracing」で発表された、「Sparse Voxel Octree」という手法だ。Octreeとは「八文木」のことで、Sparce Voxel Octreeでは、3次元空間のデータを、八文木構造を用いて階層化して構築する。言葉だけだとわかりづらいので、以下の図版でも八文木構造を確認いただきたい。
その際のVoxel構築はすべてGPUで処理しており、Voxel構築の効率を上げるため、中間処理を行わず(まず階層構造のないVoxelをつくってといった無駄はしない)、直接最初から階層化Voxelをつくっている。そして、必要のない空間には細かい階層をつくらない。階層構造のなかで、光源からの光の反射の情報を、最初の階層から順に書き込み、その先の、Octreeで最も細分化された最後の階層の光の反射の情報をもとに、中間階層にの必要な場所にのみVoxel情報を書き込む。
そして、カメラ視点からレンダリングする際に、複数のrayを飛ばして広範囲を探索するのではなく、コーン(円錐)状の一定の範囲内ごとにrayを探索する。探索を進めるに従いコーンの半径が大きくなり、応じて探索するOctree階層も進む。これでrayの効率よく広範囲の間接光を算出できるようにしている。
なお、Voxelにはジオメトリ情報や、反射の方向や鋭さなどの情報が格納されている。OctreeのVoxelは、階層化と、比較的多めの情報を格納しているため、それ自体を更新するとなるとやはり大きな負荷がかかるものと思われる。そこで、再構築が必要な場合は、シーンの中すべてを再構築するのではなく、変化あった場所だけを再構築して負荷をさげるなどの工夫も行われている。ただ、現行のFerimiやKeplerでもかなりの速度でこの処理はできているそうで、もう少しGPUの世代がすすめば、シーンのすべてのVoxel Octreeを更新しても問題ないレベルになるだろうとも想定しているそうだ。
これは、カーテンからの反射光が床に当たっているところを拡大した場面。ここでは、オブジェクトの光の反射の具合を変えることで、床の表面が光を反射しやすいツルツルの大理石のように表現したり(写真左)、逆に表面が光を反射しづらいザラザラな石の質感を表現したり(写真右)と、床の材質の違いの表現も実現している |
「Unreal Engine 4」がSparse Voxel Octreeを採用
このSparse Voxel Octreeは、実際にゲームエンジンに実装されている。それが、今年のGDCで発表されたUnreal Engineの最新版、「Unreal Engine 4」だ。当日はエピック・ゲームズ・ジャパンの担当者がこれを紹介してくれた。Unreal Engine 4はデベロッパーに配布が始まっており、最新のハイエンドPCを想定した3Dゲームの開発がすでにスタートしているという。
「Unreal Engine 4」では、グローバルイルミネーションはじめ、全てで動的にリアルタイムのレンダリングを実行するというコンセプトがある。開発環境でもリアルタイムにというコンセプトを貫き、コードの反映などを即座に行えるため、制作上の待ち時間を減らせるなどのメリットがあるという |
Sparse Voxel Octreeを採用したUnreal Engine 4のリアルタイム・グローバルイルミネーションを、GeForce GTX 680とCore i7を搭載したPC上で動作させるデモンストレーションが披露された。なお、このグローバルイルミネーション技術を用いたゲームタイトルの動作環境としては、Fermi世代が技術的に対応できる世代で、快適な動作という観点ではKepler世代のGPUが推奨されるというものだそうだ。
ほか、グローバルイルミネーション以外の部分でも、Unreal Engine 4がUnreal Engine 3から向上した部分として、パーティクルの演算をGPUで処理するようになっていることなどが紹介された。ベクトルをテクスチャに格納することで、多くのパーティクルをGPUで効率よく制御できるようになっており、100万以上のパーティクルをGPU内でリアルタイム演算することも可能になっているという。