ニュース
[CEDEC 2007]最新3D技術論文読みこなしのススメ。2007年注目の「Frequency Domain Normal Map Filtering」とは?
「トップレンダリストを目指して」というサブタイトルの用意された同セッションは,「最新の学術論文をリサーチしてゲームの実装に生かそう」という趣旨で,2007年8月に北米で開催されたCG関連の学会&展示会「SIGGRAPH 2007」において発表された,二つの最新論文について解説が行われた。その両方を採り上げるというのは筆者にはやや荷が重いので,今回は比較的分かりやすい,「Frequency Domain Normal Map Filtering」を採り上げてみよう。
英語の論文を読みこなそう
さて,本セッションは,バンダイナムコゲームスの今給黎(いまぎれ)隆氏とシリコンスタジオの田村尚希氏が,それぞれSIGGRAPH 2007で発表された最新の論文を1本ずつ紹介&解説するという形で進められた。
続いて氏が解説したのが,SIGGRAPH 2007で発表された「Eikonal Rendering」(独マックス・プランク研究所,Ivo Ihrke,Gernot Ziegler,Art Tevs,Christian Theobalt,Marcus Magnor,Hans-Peter Seidel)である。
Eikonal Renderingというのは,簡単にまとめると光が屈折するようなオブジェクト――ガラスや水などが典型例だ――を高効率でレンダリングする技法である。先にお断りしたとおり,本稿では採り上げないので,興味のある人には公式サイトに用意されている論文やサンプルビデオの参照を勧めたい。
一方,田村氏が解説したのが,同じくSIGGRAPH 2007で発表されたFrequency Domain Normal Map Filteringである。
Frequency Domain Normal Map Filteringは,ミップマップと法線マップを利用した現在のレンダリングに見られる問題点を,比較的効率のいい方法で改善しよう,というものだ。では,そもそもどういう問題があるのか。田村氏はそこから話をスタートさせた。
ミップマップと法線マップの問題点
ご存じのように,3Dキャラクターというのは,3Dのオブジェクトにテクスチャを貼ることで,“それらしく”見せている。2次元の絵であるテクスチャを3Dのオブジェクトに貼り付けているわけだ。
オブジェクトが遠くにあると,オブジェクトは小さく表示される。したがって,テクスチャも小さくしなければならないわけだが,いちいち縮小するのは面倒で,計算の負荷もかかる。そこで,その都度縮小するのではなく,あらかじめ小さなサイズのテクスチャを生成して用意しておくのだが,このとき用意されるのが「ミップマップテクスチャ」である。
ミップマップテクスチャは,元のテクスチャの2×2ピクセルの色を平均して1ピクセルする,といった具合に縮小して生成する。
ミップマップを使う場合の問題点の一つに,「奥行きがあるオブジェクトだと,奥に行くにしたがって異なるサイズのテクスチャが貼られるため,継ぎ目が生じる」というものがある。これを目立たなくするのが「ミップマップフィルタリング」という技法で,ゲームの設定などにも時折見かける「トリリニアフィルタリング」とか「バイリニアフィルタリング」というのがそれである。
ここで示されているスライドのように,2×2ピクセルの法線を平均した法線を使って,ミップマップテクスチャに対応する法線マップを用意する。これで,オブジェクトが遠くにあっても近くにあっても表面の向きの情報を含めた画像が再現される……わけだが,ここに問題がある。
現実の世界を考えてみよう。遠くにクルマがあるとする。目に映るクルマは,「クルマが反射した光」が小さく見える像のハズだ。クルマが反射する光は,元の大きさの法線マップから得られるはずである。
要するに,遠くにある物体を正しく描画するには,元の大きさのテクスチャと元の大きさの法線マップを使って反射する光の色を求め,それを小さく縮小しなければならないわけだ。このような方法を「スーパーサンプリング」と呼ぶ。
「平均化したテクスチャと平均化した法線を使って求めた色」と,「スーパーサンプリングで求めたピクセルの色」に,違いが出る場合があるのは,もはや必然である。
仮に,クルマの表面に凹凸があって,凹凸の内部が赤と黒で塗られており,赤い色の面の法線はカメラ方向を,黒い色の面はカメラとは異なる方向を向いていたとすると,遠方にあるカメラには凹凸部分の色が赤色に近い感じで見えるはずだ。だが,平均化したテクスチャと平均化した法線を使って色を求めると,決してそのようには再現されないことは,容易に想像できるだろう。
スーパーサンプリングに近い結果を得る
Frequency Domain Normal Map Filtering
スーパーサンプリングを利用すると,遠くにある物体を正しく描画できる。しかし,これをリアルタイムのレンダリングで行うのは計算量的に無理だ。できるだけシンプルな方法で(=リアルタイムのレンダリングが行える程度の計算量で)スーパーサンプリングに近い結果が得られないだろうか,ということで提案されたのが,Frequency Domain Normal Map Filteringという技法である。
まず,スーパーサンプリングを数式化すると,「BRDF」(Bidirectional Reflectance Distribution Function,双方向反射率分布関数)だけをスーパーサンプリングすればいいという結果が得られる。
BRDFとは,「ある方向から光が入射して反射するときに,どの方向にどれくら
いの光が反射するか」の分布を表す関数である。上のスライドで網掛けになって
いる部分にあるf(ωi,ωo;nq)がそれだ。また,BRDFを視覚化してみると下のスラ
イドのような感じになる。
では,BRDFをスーパーサンプリングするとどうなるのか。それを視覚化したのが次のスライドだ。
ハートのような形が見て取れるが,これが「あるピクセルに光が入射したとき,どの方向にどれくらい反射するか」という情報で,それを論文では「Effective BRDF」(※効果つきBRDF,くらいの意味で理解しておくのがよさそうだ)と呼んでいる。Effective BRDFには「ある方向に対して反射する光の量の元の情報が残っている」ことが分かるのではないかと思う。
少し難しくなってきたので,ちょっと話を戻そう。
ミップマップテクスチャと法線マップの問題点は,ミップマップに対して(例えば)2×2ピクセルの各法線を平均化した1本の法線を使うことだった。一方,Effective BRDFなら,元となる2×2ピクセルの法線情報が残るため,よりよい結果が得られるわけである。
NDFというのは,4本の法線があったとしたら,それを4分の1で正規化したデータのこと。このNDFとBRDFを“畳み込んでやる”(=乗算して足し合わせる)と,Effective BRDFが得られる……のだそうだ。
- ミップマップテクスチャの各ピクセルに対してNDFを用意する
- 光源とカメラ位置が決まったら,NDFとBRDFをたたみ込んでEffective BRDFを得る
- そこからカメラ位置のピクセル色を計算する
という形が「よりよい結果」になるというわけである。
問題はNDFのサイズが大きいということで,それを解決するために「球面調和関数」を使う。球面調和関数を使うとNDFのサイズがかなり抑えられ,しかもEffective BRDFを求めるのが楽になるオマケまでつくようだが,一方で球面調和関数は近似に過ぎないので,理想の値からは少し外れてしまう。まあ,このあたりになるとかなり難しいので,興味がある人は後述する原論文を参照してほしい。
「で,実際のところ,どういう効果があるか?」が,会場のスライドでも紹介された,原論文の例で示しておくことにしよう。
以上,Frequency Domain Normal Map Filteringを紹介したが,言うまでもなく,こうした手法は処理コストとのトレードオフになる。セッションでも触れられていたが,法線の分布が緩やかな(=表面に凹凸がない)オブジェクトや,法線マップの解像度が低いような場合,Frequency Domain Normal Map Filteringの効果はほとんどないそうだ。そういった場合は,演算コストが大きい分だけ損をするわけで,使いどころを誤れば逆効果ではないかと筆者は思う。
いずれにしても,SIGGRAPH2007ではかなり注目された論文なので,筆者の説明では不満(またはよく分からん)という人は,コロンビア大学のサイトで公開されている原論文をぜひ当たってみてほしい。
●「Frequency Domain」とは
Frequency Domainについて,少しだけ突っ込んで説明してみたい。ある程度の前提知識が必要になるので,その点はご了承を。
さて,本文で説明したように,NDF(※NDFという概念についてのスライドを参照してほしい)をキューブマップで保存しようとするとデータサイズが大きくなりすぎ,現実的ではなくなる。そこで,球を使う。ツノ(=法線)が何本か生えたような球を想像してほしい。
そして,この球を保存するために球面調和関数を使う。球面調和関数というのは,ラプラス方程式の解――解になる関数を調和関数という――を球座標の角度の関数で書いたもので,通常,複素関数になる。球のような形状を実部と虚部という2種類のパラメータで表せるわけだ。
実部1,虚部1で真球となり,パラメータを増やすほど複雑な形状を表せる。パラメータを無限に取れば,どんな複雑な形状でも表せるようになるが,適当な数に絞っても大ざっぱな形状は保存される。球面調和関数を使えばツノの生えた球をいくつかのパラメータに還元でき,NDFをわずかなサイズに切り詰めることができる,というわけである。
ところで,パラメータの数を詰めるということは高周波成分を切り捨てる作業に相当する。ラプラス変換とフーリエ変換の関係を知っていれば,おおよそ想像が付くと思われるが,「Frequency Domain」(周波数域)という名称は,このあたりから来ているのだ。
Frequency Domain Normal Map Filteringにおいて法線データの高周波成分(=急峻な法線の変化)は再現されないのだが,元を正せば法線データの細かな情報が失われることが問題だった。つまり,「NDFを圧縮するときのパラメータの数を絞りすぎると元も子もないことになりかねない」ので,このあたりは押さえておいたほうがよさそうである。
- この記事のURL: