PRTの基本~静的PRTとは?
PRTは、何を事前計算するかによって複雑度の度合いは変わってくる。
本連載で取り扱うPRTは、2006年に開催されたゲーム開発者会議CEDEC 2006にてピラミッド社が発表した内容に沿ったものを元にしており、「環境マップを丸ごと光源と考えて、複雑な遮蔽に配慮してリアルタイムレンダリングする」というテーマに限定している。
シーン内のモノが動かないという前提でのPRTが「静的PRT」だ。2002年に発表されたPRTの開祖的論文はこの静的PRTだった。原案発表者のSloan氏は元Microsoftで、Direct3D開発に深く携わっていた人物である |
そのシーンを取り巻く情景をキューブ環境マップとして、これを光源に見立ててライティングを行うライティングは特に「Image Based Lighting」(IBL)と呼ばれる。本連載で解説するPRTのライティングはこのIBLを前提とする。
ピクセル単位のライティングを行う際に、そのピクセルの向き(法線ベクトル)に基づいてキューブ環境マップを参照し、そのテクセルを光源に見立てて陰影演算を行う簡易技法もIBLと呼ばれるが、ここで言っているIBLは遮蔽やその他の複雑な光の伝搬(陰影だけでなく、場合によっては光の浸透や屈折、反射などなど)に配慮したものを指す。
そうした高度なIBLをまともに実装するには、まず、そのシーンの各頂点のそれぞれから全方位を見回したときの遮蔽情報と法線ベクトル情報(実際には余弦項。後述)をテクスチャに記録しておく。これが「事前計算」部分だ。
そしてレンダリング時には、各ピクセルないしは各頂点において、事前計算で作成したそのテクスチャから光伝達関数を復元し、その時の視線の向き(視線ベクトル)に配慮して、キューブ環境マップ光源を参照してライティングを行う。これがIBLベースのPRTの基本的な流れだ。
その事前計算部分において、「全方位の遮蔽構造の調査」を行うわけだが、全方位とはいっても、実際にはテクスチャリソースは有限なので8方向、16方向とか適当な数の方向への調査となる。また、その遮蔽構造の調査はレイトレーシング的な手法で行われる(GPUアクセラレーションを使った方法もあり)。
「余弦項」とは、その適当な全方位方向それぞれと法線ベクトルとの内積のこと。例えば32方向について遮蔽構造を調べてそれをキューブマップに記録したら、その32方向についての余弦項も計算してキューブマップに記録する。
この遮蔽と余弦項の2つのキューブマップを掛け合わせたものをIBL積分項と呼び、実際にはこれを事前計算して保持しておくことになる。4万個の頂点のシーンならば、このIBL積分項も4万個作らなければならないわけで、これはリアルタイムに計算するのはまず無理だということが想像できるはずだ。しかも、4万個のキューブマップを管理するというのも、ビデオメモリ容量の観点から見れば非現実的だと言わざるを得ない。(続く)
(トライゼット西川善司)