ここまでで、リアルタイム3Dグラフィックスの歴史や概念の部分は大体理解いただけたのではないだろうか。今回からは、実際に3Dゲームなどで応用されている3Dグラフィックス技術の概念などについて細かく紹介していこうと思う。
主に、Xbox 360やPS3、2006年以降のPC-3Dゲームグラフィックスなどで使われることの多いテクニックや技術を中心に紹介していく。
法線マップ技術の台頭
2000年、DirectX 8が発表され、GPUがプログラマブルシェーダ・アーキテクチャ・ベースとなって、最も普及した技術が法線マップを用いたバンプマッピングだろう。
ということで、まずは数回に渡り、「法線マップ」の技術的概念を解説すると共に、実際のゲームタイトルでの応用のされ方を紹介していく。
1ポリゴン未満の微細な凹凸を表現するために
リアルタイム3Dグラフィックスは最終的には適当な解像度の2Dフレームに対して描かれる。当たり前のことだ。
例えば数百万ポリゴンの高精細3Dモデルがあったとして、これを640×480ドットの画面で表示すると、ほとんどのポリゴンが1ピクセル未満でしか表示されないだろう。
これは極端な例だが、一生懸命細かいモデリングをしても実際の表示時にはそのモデリング精度が無駄になることが多いということだ。特に、それが顕著になるのが、微細な凹凸だ。
例えば、人間の皮膚上のシワ、石畳や煉瓦の継ぎ目、は虫類や魚類のウロコ、武器や装飾品に刻み込まれたレリーフ模様のような細かい凹凸は、ポリゴンでモデリングしたところで、それが表示時に報われないことが多い。報われないだけならばまだいいが、ポリゴンデータとして存在すれば、それはメモリをより多く消費してしまうし、CPU→GPUへの3Dモデルの転送も余計に時間が掛かってしまう。そして実際にはほとんどが1ピクセル以下に落ち込んでしまうのに、それでも頂点シェーダはその微細凹凸のポリゴンの全てを処理しなければならないので、無駄に高負荷を強いられることになる。
そこで、発想を転換し、細かい凹凸がそれらしく見えればいい……というフェイクの技法が模索されだす。これに対する1つの解が「法線マップを利用したバンプマッピング」なのだ。
この方法は、最終的に凹凸があるかのように陰影がでることの再現に注力し、そこに実際のポリゴンレベルでの細かい凹凸は設けないのが特徴だ(大ざっぱな凹凸は設けておく場合が多い)。
法線ベクトルさえあれば陰影は出せることに着目
微細な凹凸が「凹凸として見える」のはなぜだろうか。
それは凹凸に明るいところや暗いところができるから--すなわち陰影がでてくるからだ。
では「陰影がでる」というのは、どういうことか。
これはライティング(光源処理)がなされるからだ。
ではライティングに必要なものは何だろうか。
反射方程式にはその表現したい材質ごとに様々なものがあるが、ライティングに必要な基本パラメータは、視点から視線を表す「視線ベクトル」、そして物を照らす光の向きを表した「光源ベクトル」の2つにくわえ、光に照らされる面(ピクセル、ポリゴン)の向きを表すベクトル「法線ベクトル」だ。
法線ベクトルは、表現したい凹凸に密接に関わってくるパラメータであり、その凹凸の法線ベクトルだけがあれば、これを使って反射方程式を解くことで、凹凸らしい陰影が出せるのだ。
ただ、実際には凹凸がないので、その凹凸が実際にあるかどうか判別しにくいくらいの角度や遠目でないと不自然さが露呈してしまう。逆に、本当に凹凸があるのか分からない程度の非常に微細な凹凸の陰影表現には向いていると言うことになる。
それでは微細凹凸の法線ベクトルをどう取り扱えばいいのか。
最終的に微細凹凸の陰影はピクセル描画の結果として出ればいいのだから、つまり、ピクセル単位に法線ベクトルを与えるには何が都合がいいかを考えればいい。
すると、答えは自ずと導かれてくる。「テクスチャ」だ。
テクスチャというと一般的にはポリゴンに貼り付ける画像や模様を連想しやすい。
例えば、画像テクスチャをポリゴンに貼り付ける場合は、テクスチャから読み出したテクセル(テクスチャを構成する画素)の色を、これから描画するピクセルの色としてしまう。
このテクスチャに微細凹凸の法線ベクトルを入れ込んでおき、テクスチャから読み出したテクセルを、法線ベクトルと見なし、その時点でピクセル単位のライティングの反射方程式を解けば、表現したい微細凹凸の陰影が出せることになる。
一般的なテクスチャのテクセルは画像テクスチャの場合α(透明度)、R(赤)、G(緑)、B(青)の最大4要素の色情報に割り当てられているが、これを例えばαを除くRGBの3要素に法線ベクトルのx成分,y成分,z成分を割り当てて記録しておく。レンダリング時にはピクセルシェーダでこのテクスチャからテクセルを取りだした際に、このRGB成分を法線ベクトルのxyz成分と見なして反射方程式を解いてやる。
この法線ベクトルを格納したテクスチャを特に「法線マップ」(Normal Map)と呼ぶ。一般に、この法線マップを活用した微細凹凸表現は「法線マップを利用したバンプマッピング」と呼ぶのが正しいはずだが、バンプマッピングの技法として法線マップを活用する手法がスタンダードになってしまったので、バンプマッピングと「法線マップを利用したバンプマッピング」が同義になりつつある。また、テクスチャマップを貼り付けることをテクスチャマッピングというのにちなんで、この技法が「法線マップを貼り付ける」という意味を込めた「法線マッピング(Normal Mapping)」と呼ぶことも多くなってきている(続く)。
(トライゼット西川善司)