帯域調和関数(Zonal Harmonics)の導入

SHEXP技法では、球のShadow Fieldsの取り扱いについてさらなる最適化を推し進める。

球の形状はどこから見ても同じ"円"だ。

まじめに全天周分のShadow Fieldsを保持すれば確かに実行面で有利だが、メモリの消費量が大きくなってしまう。どのみち、どこから見ても同じ円にしかみえないのであれば、ある一軸方向の一定距離の各地点のShadow Fieldsを算出しておき、これをリアルタイムレンダリング時にSH Rotationにて変移させる処理を実装してやればメモリ消費量をかなり少なくできるはずだ。しかし、SH Rotationの計算自体の負荷が高いので実際にはパフォーマンス面で不利になる。

球のShadow Fieldsの取り扱いについての3つの実装案

そこで、高い処理速度とメモリ消費量のいいとこ取り的なテクニックであるZonal Harmonics(帯域調和関数)という概念を導入する。

Zonal Harmonicsでは、前述したSH Rotationで変移させる実装案のように、一方向のみのZonal Harmonics係数を保持しておけばよいのでメモリの消費量は小さいうえに、計算負荷はそれほど高くはない。

Zonal Harmonicsには回転対称な情報にしか適用できないという制約があるのだが、取り扱う対象がどこから見ても同一形状の球の遮蔽構造データなので問題はない。

Zonal Harmonicsの要点

取り扱う対象がどこから見ても同一形状の球の遮蔽構造データなのでZonal Harmonicsが適用できる

Zonal Harmonicsにおいて保持する一方向の決定の仕方にはコツがいる。ある条件(図参照)を満たす方向で決定し、遮蔽構造を算出し球面調和関数にて近似して遮蔽係数ベクトルを得ると、m=0以外の係数は全てゼロになってしまう。この特性に着目すれば、m=0の時の遮蔽係数ベクトルだけを保持しておけばよいことになる。

この特性は、その特殊条件を満たす方向を選択した場合の効果だ。そして、このm=0の時の遮蔽係数ベクトルにZonal Harmonicsの補正係数を掛けて算出したものがZornal Harmonics係数(ZH係数)になる。

言い換えれば、ZH係数は、特殊条件下におけるm=0の球面調和関数の遮蔽係数ベクトルの小細工(=Zonal Harmonics)導入版ということができる。

Zornal Harmonics利用のための特殊条件

Zonal Harmonics係数の計算の流れ。l=3までの球面調和関数の遮蔽係数ベクトルは本来ならば16個保存しなければならないのだが、特殊条件下の恩恵によってm=0以外の係数は全部ゼロになってしまうのでそれらが不要となる。ここがポイント

結局、欲しいのは任意の方向の遮蔽係数ベクトルだ。これは、その任意の角度の球面調和関数と、先ほどの基準軸で求めたZH係数の積算から求められる。このあたりの数学的な理論と証明は省略するが、この技法を利用する側はそういうものだということで使うことができる。ポイントとなるのは、SH Rotationではベクトルと行列の積算が5回も必要なのに対し、ZHを用いるとベクトル同士の積算一回で任意の方向の遮蔽係数ベクトルが求まるという点だ。

Zonal Harmonicsの導入で任意の方向の遮蔽係数ベクトルが比較的低負荷に計算可能となった

実際の実装では球の中心から異なる一定間隔距離ごとのZH係数を求め、これをテーブル化して保持することになる。この"一定距離"とは「球の中心からの一定距離」ではなく、球の中心へ向けた直線と、球の面に対する接線が織りなす角度の変化(球に対して最も遠い=0°~球に対して最も近い=90°)単位で与える。これは後述する遮蔽係数ベクトルの統合計算を効率よく行うためのテクニックになる。(続く)

ZH係数テーブルの概念

ZH係数を求めるポイントは距離ではなく角度をキーにして作成するのがあとで便利にきいてくる

球のShadow Fieldsのまとめ。ZH係数を利用することで省メモリ、高速実行が実現される

(トライゼット西川善司)