[CEDEC#07]リアルタイム大域照明レンダリング最前線
2004/09/09 22:34
 CEDEC最終日に行われた,ナムコの今給黎氏らとピラミッドの田村氏らによって行われた二つのセッションは,リアルタイムグラフィックの方向性を示すものだ。今後,ゲーム内で映画並みの自然なシーン描画を実現するためには避けて通れない研究である。

 その前に,9月7日のニュース(「こちら」)でのPRTに関する解説で,前計算する部分の理解がかなり間違っていたようなので訂正しておきたい。ただし,詳しく説明するとレンダリング方程式とか,数式満載になるのでざっと概念的に流してみる。
 最近のリアルタイムレンダリングの主な話題は,レンダリング方程式という1個の数式に集約される大域照明モデルをどう実装するかというところに集中している。これは物理的に正しい照明を定義した方程式で,ある頂点(ないし1点)からカメラに向かう光の総量を定義したものだ。簡単に書くと,

  カメラに向かう光=自発光+周りからの光の反射の総和

で表される。簡単に「周りからの光」といっても内容は複雑で,まともにやるとリアルタイムではとても処理しきれないので,「発光体じゃないことにして自発光は0にしておこう」とか「反射はとりあえず考えないことにしよう」などとさまざまな簡約化が行われ,その条件に合った近似式を導入したり,さらに式を変形して,レンダリング時に変わらない部分を括り出し,その部分は前もって計算しておいてやろうということで,その前計算用に括り出された部分がPRTのPre-computedの部分に相当する。具体的には,Transferベクトル部分ということになるらしい。詳しい話は論文検索などで調べてほしい。

■ブラー式ソフトシャドウ

 さて,今回の今給黎氏の講演では,ソフトシャドウの独自アルゴリズムと反射付きPRTを実装したシェーダーについて解説が行われた。ソフトシャドウに関する技術では初日のNVIDIAによるNaluの例など,UV面へのシャドウを2次元ブラー後に張り直すなど,実用的なアルゴリズムも提案されている。ただ3次元のものを2次元で処理するのでブラー量などが正確ではなくなる。パースが付いた面など,場合によっては不自然な影になるかもしれない。
 今給黎氏の手法は,2個の光源(光源の上下)から影を落とし,その差の部分を半影と考えて差の範囲にグラデーション処理を施すというものだ。光源の角度や物体が複数ある場合などで破綻することもあるようだが,ゲーム中では比較的回避しやすいだろうということである。結果はそれなりにちゃんとしたソフトシャドウになっている。

→動作ムービーは「こちら」



 続く因数分解表現を使用したイメージリライティングの話では,それこそレンダリング方程式が炸裂である。

これがいわゆるレンダリング方程式


素材によっては高次の処理を行わないとちゃんとした画像にならない
 ここでの話も,基本的にPRT(計算済み放射輝度伝達)を使う。ただし,マイクロソフトのDXSDK内にあるデモやAPIはディフューズ面にしか対応していなかった。反射しない面は角度の違いによる影響がないのでレンダリング方程式が簡略になる。今回は反射面を考慮した,よりリアルなPRTに関する解説だが,リアルタイムに反射を表現するためには光の射出角度ごとに伝播行列を展開しなくてはならない。単純な反射ならまだしも,反射率は素材の質感に大きな影響を与えるためできるだけ高次の近似が必要になってくる。そこで,今回はこの部分に因数分解表現を採用して精度よく近似している。
 因数分解表現で何次まで展開を行うかは処理量に大きく影響するのだが,これは素材の双方向反射率分布関数によって異なってくるので一概には決められないようだ。今回は4次までの処理でシェーダを組んでいたが,シミュレーションの結果では相当高次元に処理しないと収束しない素材もあるようだ。



 結果のレンダリング例をいくつか。4次ではまだ不足という素材もあるが,全体的な質感の高さはかなりのものだ。GeForce 6800で30fps程度というのは微妙なところだが,将来的にはゲーム内で実用化されることも十分にありうる。

→ムービーその1は「こちら」
→ムービーその2は「こちら」



■ Wavelet変換

 藤田氏らのWaveletに関する発表も,大筋では似たようなところに関する話で,こちらはモデルの全頂点に対する環境マップを作成して大域照明を行うといった感じのアルゴリズムだ。扱うのは膨大なデータ量となるが,環境からの反射光をより忠実に反映できる。問題となる膨大なデータ量を処理するために使うのが,Wavelet変換と呼ばれるアルゴリズムである。これはフーリエ変換(すべての連続関数をsin波の総和に変換する)のsin波の代わりにWaveletと呼ばれる矩形波を使う感じで,非連続部分の多いデータに対して高い効率で圧縮が可能になる。このあたりは,画像圧縮の離散コサイン変換も似たような話ではある。とにかく,Waveletを使うと上位2%のデータだけ抽出して圧縮しても,99%程度の再現度が確保できるようだ。矩形波ならではの1,0,−1といった単純な数値処理も頻出し,非常に高速な変換が実現できる。
 デモでは最新の論文による反射面を含むWavelet変換による処理なども実演されたが,2fps程度という重さだった。すべてCPUでの演算だということだったので,GPUを活用すれば高速化はできるだろうが,現状では使いどころは難しい技術だ。全頂点に対する前計算が必要なので,動く物体などに適用はほぼ不可能。それでも限定的な用法とはなるだろうが,将来的なレンダリング手法としては注目されているアルゴリズムだ。今後のアルゴリズムの展開とハードウェアの進化次第では一般的に使われるものとなるかもしれない。とりあえず現状では研究段階のものである。

→反射付きWavelet PRT映像は「こちら」

 GPUの劇的進化とプログラマブルシェーダの普及で,リアルタイムグラフィック表現もこれまでとは別次元の方向に向かいつつある。最新の研究論文の成果がGPUによって手軽にシミュレートできるようになったおかげで,PCでは表現に関する試行錯誤が容易になっている。勢いでいえば,映画のCG表現と同等かそれ以上の表現が登場してくるのも時間の問題。一般ユーザーには難しい数式が多いのが困りものだが,今後のグラフィックの方向性は間違いなく大域照明を実現する方向に向かうだろう。
 やがてはゲーム内で映画並みの,より自然なビジュアルが実現できるようになるはずだ。そのためにさまざまな研究がこうして行われ,それなりに成果を出し始めている。今後の展開に期待しよう。  (aueki)





友達にメールで教えよう!

この記事へのリンクはこちら
http://www.4gamer.net/news/history/2004.09/20040909223431detail.html