アカデミックな視点からの、環境マップのプレフィルタリングの実装

カナダのウォータールー大学でコンピュータ・サイエンスの修士号を取得した後、Max-Planck-Institut Informatik(MPII)の博士課程に進んだKautz氏は、ここで正真正銘のリアルタイム・レンダリング研究に取り組みはじめた。この時期のリアルタイム・レンダリングは、GPUなどを導入して従来のソフトウェアが行ってきた“フォトリアリスティック・レンダリング”に相当する質の高いレンダリングを、さらに高速化することを目指すようになっていた。したがって、これまでソフトウェアを前提にして考案されてきたフォトリアリスティック・レンダリングの技法を、どのようにしてGPUに適した形に作り変えるかが鍵となっていた。

そのための方法として当時主流になっていたものの1 つに、環境マップを用いたイメージベースト・ライティングがあった。この方法における環境マップは環境光を表しており、環境マップの各ピクセルをライトと考えてシーンを照らしレンダリングを行った。環境マップをテクスチャと考えていた従来のレンダリング方法では、レンダリングする物体の各点に、各点の法線方向に位置する環境マップのピクセル色が割り振られていた。これに対し、環境マップの各ピクセルをライトと考えてグローバルイルミネーションのような物理的に正確なレンダリングを行うためには、環境全体のあらゆる方向から物体表面上の各点に入射する光を考慮する必要があった。そこ で環境マップの各ピクセル値に対し、ある一定のルールに従った重み付けを行い、それらすべてを足し合わせた値を物体表面上の各点に割り当てる方法が考えられるようになった。

このようにレンダリングに先立ってテクスチャをフィルタリングしておく作業は、プレフィルタリングとよばれる。環境マップのプレフィルタリングを用いたレンダリング方法では、環境全体からの光が物体表面に到達するまでの変化は考慮されないため、影や光の相互反射の影響を正確に表すことはできない。しかしその反面、物体表面の幾何学的な形状とは切り離したレンダリングが可能で、線形補間というGPUに最も適した計算になっていたため、リアルタイム・レンダリングに適したグローバルイルミネーションの近似方法だと考えられた。そのため、1990年代後半から21世紀初頭にかけて、実に様々な環境マップのプレフィルタリング方法が考案された。

Kautz氏が2000年のEurographicsで発表した“A unified approach to prefiltered environment maps”という論文は、別々の視点から個々に考案されてきた環境マップのプレフィルタリング方法を一同に集め、1 つの視点から見直し、すべての方法に適用可能な効率化のためのアルゴリズムを提示した。具体的に解説すると、このアルゴリズムでは、プレフィルタリングを行うフィルター・カーネル、および環境マップの両者に階層構造をもたせる方法を提示した。計算精度が許す限り低い解像度のフィルター・カーネル、および環境マップを用いることで計算の効率化を実現したのだ。この論文は、アルゴリズム自体が高く評価されたのに加え、環境マップのプレフィルタリングというものを理論的に体系化し、よりアカデミックな視点で実装しようとする動きを誘うきっかけとなった点でも大きな意義をもっていたのだ。

図A

環境マップのプレフィルタリング:フィルター・カーネルと環境マップの階層化


論文中では、環境マップのプレフィルタリングを効率化するための汎用性の高いアルゴリズムとして、フィルタリングを行うフィルター・カーネル、および環境マップに階層構造をもたせる方法を提示している。この方法では、図Aの上段のように、オリジナルのフィルター・カーネル(左)と環境マップ(右)に対してミップ・マップを作成し、解像度レベルの違う階層構造をもたせている(オリジナルのフィルター・カーネルや環境マップは、最もレベルの高い階層に相当する)。オリジナルのフィルター・カーネルを用いてオリジナルの環境マップをフィルタリングすれば、計算精度は最も高くなるが、計算を適用するピクセル数が多くなるだけに計算負荷は重くなる。できるだけレベルの低い階層のフィルター・カーネルと環境マップを用いて、オリジナルのフィルター・カーネルと環境マップを用いたフィルタリングの計算を近似しようというのがこの方法の考え方だ。
図Aの下段は、どの階層のフィルター・カーネルと環境マップを用いるかを判断する方法を示している。ここでは現在のフィルター・カーネルの階層レベルのピクセル値と1つ上のレベルで発生する4つのピクセル値との差を調べ、その差が一定の上限を上回らない場合には、現在のレベルのフィルター・カーネルと同じレベルの環境マップを用いてフィルタリングの計算を行う。差が一定の上限を上回った場合には、1つ上のレベルに進んでチェックを繰り返し、差が一定の上限を上回らないケースに到達した段階で、そのレベルのフィルター・カーネルと同じレベルの環境マップを用いてフィルタリングの計算を行う。

“A Unified Approach To Prefiltered Environment Maps”
(Jan Kautz, Pere-Pau Vázquez, Wolfgang Heidrich, Hans-Peter Seidel, Proceedings of the 11th Eurographics Workshop on Rendering, 2000)

リアルタイム・レンダリングにおける、球面調和関数の可能性の示唆

前述したようにKautz氏が2000年のEurographicsで発表した論文は、環境マップのプレフィルタリングいう題材を、これまで以上にアカデミックな視点から捉えるという動きを作り出した。その代表例といえるのが、2001 年にRavi Ramamoorthi氏らによって発表された“An Effcient Representation for Irradiance Environment Maps”という論文だった。2000年のKautz氏の論文は、階層構造の導入によって汎用性の高い環境マップのプレフィルタリングの効率化を可能にした。これに対しRamamoorthi氏らの論文は、球面調和関数(Spherical Harmonics)を導入することによって、物体表面が完全なディフューズ面であれば、わずか9種類のプレフィルタリングを環境マップに適用することで物理的に正確なレンダリングが可能になることを証明した。

具体的に解説すると、この方法では、まず環境マップが放つ光を球面調和関数の基底関数(SH基底関数)に分解し、SH基底関数に重みを付けて足し合わせたもので近似する。各SH基底関数の重みは、環境マップの各方向から飛来する光の強さ(ラディアンス)と、その方向に対するSH基底関数の値とを掛け合わせた結果を、すべての方向に渡って足し合わせた結果となる。これはまさに、環境マップのプレフィルタリングに相当する。

一方、物体表面が完全なディフューズ面の場合、物理的に正確なレンダリング結果は、入射する光をイラディアンスという単位で表したものの定数倍となることが知られている。Ramamoorthi氏らは、前述の論文に先立ってオプティックス(光学)の分野で発表した論文(注)で、イラディアンスをSH基底関数の線形結合に分解すると、その重みは、環境マップが放つ光をSH基底関数の線形結合に分解した場合の重みの定数倍となること、なおかつ、SH基底関数の次数が一定以上になると、定数倍をする定数の値が限りなくゼロに近づくことを証明している。したがって、次数が小さい方から9個分のSH基底関数のみを用いて環境マップが放つ光を近似し、その重みを定数倍すれば、物理的に正確なレンダリング結果が得られることになる。前述したように、SH基底関数の重みの計算とは、環境マップのプレフィルタリングに相当する。つまり、あらかじめ9種類のプレフィルタリングを行っておけば、後は重み付けの単純な計算をGPU上で行うだけで、リアルタイム・レンダリングが可能となるのだ。

前述の方法の最大の意義は、環境マップが放つ光をSH 基底関数に分解するというアプローチのリアルタイム・レンダリングにおける可能性の大きさを示唆したことだといえる。この流れは、環境マップのプレフィルタリングというテーマを越えて、リアルタイム・レンダリングの歴史を揺るがす新たな方法の確立につながってゆく。そして、この新たな方法の考案と発展にKauts氏は深く関わることになるのだ。

注)“On the relationship between radiance and irradiance:Determining the illumination from images of a convex lambertian object”(Ravi Ramamoorthi and Pat Hanrahan, Journal of the Optical Society of America A, 2001)

図B

環境マップと球面調和関数:環境光をSH 基底関数が放つ光に分解


この方法の最大の意義は、SH基底関数そのものを光源と考え、環境光をこれらのSH基底関数が放つ光に分解して考えている点だといえる。画像最上段は次数の最も低いものから順に9個のSH基底関数で球を照らしてレンダリングしたもの、その下はCGキャラクターのモデルを同様に9個のSH基底関数で順に照らして2つの異なった視点からレンダリングしたものを示している。最下段の画像はこれら9個のSH基底関数に対して3段目に記述されている重み(Coefficients)を与えて、同じキャラクターを2つの異なった視点からレンダリングした結果を示している。最下段の一番右側の画像は、これらをすべて足し合わせて得られた画像を示している。この画像は、9個の基底関数のそれぞれに同様の重みを付けて、すべて足し合わせて得られる環境光でキャラクターを照らしてレンダリングした結果に相当する。

“An Efficient Representation for Irradiance Environment Maps”
(Ravi Ramamoorthi and Pat Hanrahan, Proceedings of Siggraph 2001)