オススメ機能
Twitter
お気に入り
記事履歴
ランキング
お気に入りタイトル/ワード

タイトル/ワード名(記事数)

最近記事を読んだタイトル/ワード

タイトル/ワード名(記事数)

LINEで4Gamerアカウントを登録
[CEDEC 2012]低負荷で多重反射を含む動的GIを実現可能な「Modular Radiance Transfer法」とは
特集記事一覧
注目のレビュー
注目のムービー

メディアパートナー

印刷2012/08/21 18:49

イベント

[CEDEC 2012]低負荷で多重反射を含む動的GIを実現可能な「Modular Radiance Transfer法」とは

ミドルウェア/開発ツール
 パシフィコ横浜で開催されているゲーム開発者のためのイベントCEDEC 2012の初日となる8月20日に,シリコンスタジオの田村尚希氏安田 廉氏による「コンピュータ・グラフィックス関連の最新論文紹介」と題した講演が行われた。
 これは同社が例年行っているもので,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万と,かなりの負荷になり,さらに光源が動いたりすると,変換行列の量だけでメモリがあふれてしまいそうだ。

ミドルウェア/開発ツール ミドルウェア/開発ツール

 ここで導入されるアイデアが,

  ある直接光の状態は,いくつかの直接光の状態の和で表せる

というものである。いくつか基本になる状態(基底)を求めておいて,それぞれに加重を付けた総和を取れば,どんなシーンにでも近似できるとする考え方だ。さらに,直接光がその方法で近似できるなら,それに対応した間接光でも同じことが適用できる。

ミドルウェア/開発ツール ミドルウェア/開発ツール

ミドルウェア/開発ツール
 問題は,どうやったら最適な基底を揃えられるかだが,これはいろいろなライティングで演算した結果を集めて,そこから特異値分解という操作を行うことで得られるという。特異値分解というのは,ある行列を「出力の基底行列」「倍率」「入力の基底行列」の積に分解するもののようで(Wikipediaでの解説はこちら),どんな言語でもライブラリが用意されているようなポピュラーな処理なので,既存のライブラリをそのまま使うのがよいだろうとのこと。

ミドルウェア/開発ツール ミドルウェア/開発ツール
ミドルウェア/開発ツール

 とにかく,直接光の行列Ldを分解すると,

  Ld=Ud Σd VTd

という形の行列が出力されるのだが,このうちUdに当たる部分を基底行列として使用できる。Udの部分は,2次元行列として出力されるものの,1列ずつがそれぞれ基底となるものであり,しかも左から順に重要なものが並ぶので負荷と要求される精度に応じて,どこまで使用するかを決めることができる。

ミドルウェア/開発ツール

ミドルウェア/開発ツール
ミドルウェア/開発ツール
 さて,基底を求める方法は上記で解決されたのだが,そもそものサンプルの与え方には2種類のアプローチがあるという。直接光を優先したサンプルを与えるか,間接光を優先したサンプルを与えるかだが,ここは,間接光重視がよいとのこと。間接光重視のサンプルで算出した基底では,直接光部分の精度がかなりひどくなるとのことなのだが,直接光については,普通のピクセルシェーダを使ったシェーディングが使えるので,ここで算出した結果は使わずに,普通のレンダリング手法で明るさを求めてから間接光成分を加えると,全体的な精度が上げられるというわけだ。
 なお,SIGGRAPHに出された元の論文では,より精度を上げるハイブリッド手法について解説されていたそうなのだが,講演では簡単に式を示すだけに留められた。「意味は分からなくても計算はできます」とのこと。

 このようにして,前計算で基底を求めておいて,ランタイム時には間接光の基底からk個の列を取り出したものと,直接光の基底からk個の行を取り出したものと,直接光の行列を掛けるという操作で間接光の行列を求めることができるようになる。kはシーンによって異なるとされるが,だいたい4〜32で十分とのこと。
 1万頂点の場合,最初のFを掛ける方式では1×1万の行列に1万×1万の行列を掛ける処理が必要だったのに対し,この処理だと1万×32(最大)の行列と32×1万の行列と1×1万の行列の掛け算となり,かなり計算量が軽減されていることが分かる(これで重いなら,32の部分をさらに軽くすることも可能)。

ミドルウェア/開発ツール

背景部分のデモの様子
ミドルウェア/開発ツール

ミドルウェア/開発ツール
 続いて,それ以外のオブジェクトについてもGIを適用する方法が示された。動く可能性のあるオブジェクトにGIを適用する技法としては,Light Probeが用いられていた。空間に離散的に全方向からの光の量を記録したLight Probeというものを配置して,内部にあるものの間接光の当たり方を計算するという手法は,現在発売されているようなゲームでも多く用いられており,とくに目新しい技術ではなくなってきている。

ミドルウェア/開発ツール ミドルウェア/開発ツール
ミドルウェア/開発ツール ミドルウェア/開発ツール

 通常のLight Probeは,SH(球面調和関数)などを使って前計算されており,光源の移動などは得意としていないのだが,ここでは先ほどのGI計算のように,あらゆる光の状態がいくつかの基底状態の和で近似できるという仮定の下に処理を行うことで,動的なLight Probeを実現している。

Light Probe適用前(左)と適用後(右)
ミドルウェア/開発ツール ミドルウェア/開発ツール

ミドルウェア/開発ツール
 いろんな仮定や近似で計算量は少なくなったものの,激減すぎて本当にこれできちんとした絵が出てくるのかと疑問に思う人もいるかもしれない。デモでは,シーン内で滑らかに光源が移動しても自然な間接光表現が行われる様子が示されていた。GeForce GTX 680を積んだデモ機とのことだったが,実に500fpsというパフォーマンスである。

ミドルウェア/開発ツール ミドルウェア/開発ツール
ミドルウェア/開発ツール

ミドルウェア/開発ツール
 さて,これまでの説明でも,動的な光源に対して高品質かつ高速なGIを実現してくれそうな手法だということは窺えるのだが,この手法の真価はまた少し違うところにあるらしい。Modular Radiance Transfer法の「Modular」の部分だ。
 この手法も万能ではなく,まず問題となるのは複雑なシーンには対応できないことだ。極度に入り組んだシーンで,光源の自在な移動に対応した単一の基底を求めても(求めることはできる),精度が悪くて実用にならないのだそうだ。

 そこで出てくるアイデアが,シーンを分割してそれぞれの小区間で処理を行うという手法である。それぞれの小区間での処理は,これまで見てきたものと同じなのだが,区間分けしたことにより新しく行わなければならない処理も出てくる。つまり,別の区間からの間接光の処理である。

ミドルウェア/開発ツール ミドルウェア/開発ツール

 基本的には,別の区間であっても頂点から頂点への光の伝播を計算すればよいのだが,SIGGRAPHで発表された論文では,各区間の区切りの平面にLight Fieldという構造を用いていた。Light Fieldは,ある点に到達する光の情報を列挙した構造体で,こっち向きの強さの光がこれくらい,こっち向きのはこれくらいの強さで……というのをまとめたものとなる。今回の実装で言うと,この頂点からの光はこれくらい,こっちの頂点からはこれくらいという情報の集合体である。
 さらに小区間を出入りする光を,入ってくる光,出て行く光,通過する光に分けて処理するなどで計算量を最小化しつつ,区間外からの光の影響を反映する手法が紹介された。

ミドルウェア/開発ツール ミドルウェア/開発ツール

 さて,実はModularの部分が出てくるのはこれからだ。論文の方式では,小区間分割を行う際に立方体で分割していく。立方体の6面のうち,開放区間がある面の数のパターンは決まっており,回転などを駆使すれば,区間外からの光の入出はかなり少ないパターン数にまとめることができる。そこでさらなる効率化を図る……というのがModular方式の主旨のようだ。

ミドルウェア/開発ツール ミドルウェア/開発ツール

ミドルウェア/開発ツール
 しかし,今回のシリコンスタジオの実装では,そのModularの部分にはあまり踏み込んでいないとのことだった。立方体分割のメリットを生かそうとすると,シーンの自由度に影響が出るのだそうだ。ただでさえかなり複雑な手法なうえ,そこまでしなくても一定の成果は享受できるので,汎用性のほうを重視しているのだろう。

 最後にModular Radiance Transfer法の長所と短所がまとめられた。

ミドルウェア/開発ツール

講演を行ったシリコンスタジオの田村尚希氏(左)と安田 廉氏(右)
 とにかく速い,複数回の反射も扱いやすい,汎用性が高いなどの長所がある一方,動的オブジェクトはGI計算には含まれていないので,動的オブジェクトが極度に多いシーンではGI部分が不自然になるなど,使う局面は選ばれる,頂点カラーを意識したアセットを作らなければならないなどの癖があるというのが結論となる。
 ただ,頂点カラーを意識したアセットはPlayStation世代のゲームでやっていたことと同じなので,デザイナーには指示しやすいとのことだった。また,動的オブジェクトについても,今年のSIGGRAPHではそれに対応するDelta Radiance Transferという手法が発表されたとのことだったが,残念ながらこちらは完全な解決策というわけではないようだ。

 なんにせよ,多少癖はあっても,現行世代機でも実行できそうな新手法ということで,実際のゲームへの応用も期待できそうだ。まだまだ改良されていきそうなアプローチなので,今後の展開も楽しみだ。
  • 関連タイトル:

    ミドルウェア/開発ツール

  • この記事のURL:
4Gamer.net最新情報
プラットフォーム別新着記事
総合新着記事
企画記事
トピックス
スペシャルコンテンツ
注目記事ランキング
集計:11月17日〜11月18日
タイトル評価ランキング
81
KENGOHAZARD2 (PC)
76
鬼ノ哭ク邦 (PC)
74
2019年05月〜2019年11月