イベント
[CEDEC 2012]低負荷で多重反射を含む動的GIを実現可能な「Modular Radiance Transfer法」とは
これは同社が例年行っているもので,SIGGRAPHなどで発表された最新の論文を,ゲームで転用可能なサンプルを示しつつ紹介するという形式になっている。最新論文による技術だけに,毎年難解なテーマが取り上げられることが多いのだが,比較的平易に勘所を示しつつ実装の注意点などを示してくれるという,業界のグラフィックス技術者にとってはとてもありがたいセッションとなっている。
今回のテーマは「Modular Radiance Transfer法」というもので,昨年のSIGGRAPHで発表された論文を基にしている。
Modular Radiance Transferとは,最近流行のグローバルイルミネーション(以下,GI)関連の技術の一つで,事前計算が必要など注意点はあるものの,多重反射を含んだ間接光表現を非常に高速に処理できるのが特徴となる。
昨今では,Unreal Engine 4で採用されたVoxel Corn TracingなどのリアルタイムGI技術が注目を集めているが,それらの多くが1,2回の反射しか扱えないのに対し,Modular Radiance Transferでは,現行世代機でも処理できる軽さで,ほぼ無制限の間接光反射を扱えるなど,クオリティと速度の面でのアドバンテージがある。田村氏の話では,使いどころを選ぶものの,使いこなせれば1ランク上の表現が可能になるとのこと。
まず,GI計算に使用する背景部分(動かない部分)と,その内部に配置されるオブジェクトを切り分けて処理を進める。とりあえず,最初は背景オブジェクトだけでのGIを実装し,動くオブジェクトについては追加で実装するような形となる。
そして背景部分では,頂点単位の明るさをもとに内部を補間するような処理が前提となっている。問題になるのは各頂点での光の量だ。なお,各頂点での明るさを決めるには,その頂点に対する直接光と間接光を分けて考えるようにしているので,覚えておいてほしい。
シーン内の光の量は行列で扱われる。100頂点のポリゴンでできたシーンがあったら,それぞれの頂点での光の量を順に100個並べたような行列を作るわけだ。これを直接光用の行列と間接光用の行列で別々に用意しておく。
面白いのは,直接光用の行列に掛けると間接光用の行列になるような変換行列Fが存在すると考えるところである。確かに,各頂点の明るさが決まれば,そこからほかの頂点への明るさの伝播量は一意に計算できる。このFを事前計算(レイトレーシングを使用する)して求めておけば,直接光の影響(GIを使わないときの明るさ)にFを掛けるだけでGIの効いた絵が即座に取り出せる……わけだが,これもシーンがある程度単純な場合に限られてくる。
この手法は,頂点数が少ないうちは有効だが,複雑なシーン,例えば頂点数が1万個だと,変換行列の大きさは1万×1万と,かなりの負荷になり,さらに光源が動いたりすると,変換行列の量だけでメモリがあふれてしまいそうだ。
ここで導入されるアイデアが,
ある直接光の状態は,いくつかの直接光の状態の和で表せる
というものである。いくつか基本になる状態(基底)を求めておいて,それぞれに加重を付けた総和を取れば,どんなシーンにでも近似できるとする考え方だ。さらに,直接光がその方法で近似できるなら,それに対応した間接光でも同じことが適用できる。
とにかく,直接光の行列Ldを分解すると,
Ld=Ud Σd VTd
という形の行列が出力されるのだが,このうちUdに当たる部分を基底行列として使用できる。Udの部分は,2次元行列として出力されるものの,1列ずつがそれぞれ基底となるものであり,しかも左から順に重要なものが並ぶので負荷と要求される精度に応じて,どこまで使用するかを決めることができる。
なお,SIGGRAPHに出された元の論文では,より精度を上げるハイブリッド手法について解説されていたそうなのだが,講演では簡単に式を示すだけに留められた。「意味は分からなくても計算はできます」とのこと。
このようにして,前計算で基底を求めておいて,ランタイム時には間接光の基底からk個の列を取り出したものと,直接光の基底からk個の行を取り出したものと,直接光の行列を掛けるという操作で間接光の行列を求めることができるようになる。kはシーンによって異なるとされるが,だいたい4〜32で十分とのこと。
1万頂点の場合,最初のFを掛ける方式では1×1万の行列に1万×1万の行列を掛ける処理が必要だったのに対し,この処理だと1万×32(最大)の行列と32×1万の行列と1×1万の行列の掛け算となり,かなり計算量が軽減されていることが分かる(これで重いなら,32の部分をさらに軽くすることも可能)。
通常のLight Probeは,SH(球面調和関数)などを使って前計算されており,光源の移動などは得意としていないのだが,ここでは先ほどのGI計算のように,あらゆる光の状態がいくつかの基底状態の和で近似できるという仮定の下に処理を行うことで,動的なLight Probeを実現している。
この手法も万能ではなく,まず問題となるのは複雑なシーンには対応できないことだ。極度に入り組んだシーンで,光源の自在な移動に対応した単一の基底を求めても(求めることはできる),精度が悪くて実用にならないのだそうだ。
そこで出てくるアイデアが,シーンを分割してそれぞれの小区間で処理を行うという手法である。それぞれの小区間での処理は,これまで見てきたものと同じなのだが,区間分けしたことにより新しく行わなければならない処理も出てくる。つまり,別の区間からの間接光の処理である。
基本的には,別の区間であっても頂点から頂点への光の伝播を計算すればよいのだが,SIGGRAPHで発表された論文では,各区間の区切りの平面にLight Fieldという構造を用いていた。Light Fieldは,ある点に到達する光の情報を列挙した構造体で,こっち向きの強さの光がこれくらい,こっち向きのはこれくらいの強さで……というのをまとめたものとなる。今回の実装で言うと,この頂点からの光はこれくらい,こっちの頂点からはこれくらいという情報の集合体である。
さらに小区間を出入りする光を,入ってくる光,出て行く光,通過する光に分けて処理するなどで計算量を最小化しつつ,区間外からの光の影響を反映する手法が紹介された。
さて,実はModularの部分が出てくるのはこれからだ。論文の方式では,小区間分割を行う際に立方体で分割していく。立方体の6面のうち,開放区間がある面の数のパターンは決まっており,回転などを駆使すれば,区間外からの光の入出はかなり少ないパターン数にまとめることができる。そこでさらなる効率化を図る……というのがModular方式の主旨のようだ。
最後にModular Radiance Transfer法の長所と短所がまとめられた。
ただ,頂点カラーを意識したアセットはPlayStation世代のゲームでやっていたことと同じなので,デザイナーには指示しやすいとのことだった。また,動的オブジェクトについても,今年のSIGGRAPHではそれに対応するDelta Radiance Transferという手法が発表されたとのことだったが,残念ながらこちらは完全な解決策というわけではないようだ。
なんにせよ,多少癖はあっても,現行世代機でも実行できそうな新手法ということで,実際のゲームへの応用も期待できそうだ。まだまだ改良されていきそうなアプローチなので,今後の展開も楽しみだ。
- この記事のURL: