SH Exp演算の大胆な近似による高速化
SH Exp演算については定義通りのまじめな演算を行うのも一案だが、リアルタイムのパフォーマンスを向上させるために、ここでも近似手法を導入する。
ある値の指数は級数展開すると下図のように表すことができる。この計算はべき乗や除算が含まれるために計算負荷が高い。そこでSHEXP技法の開発研究グループでは最初の2つの項だけで近似するという大胆な手法を採択した。しかし、そのままだと誤差が大きすぎるため、重み付きの線形和で近似をする。
2つの線形項に掛ける2つの重み係数は、事前計算でテーブル化して用意しておく。となれば、この重み係数が重要になってくる。
SHEXP技法の研究開発グループでは、この2つの重み係数の算出には一般的な数値計算で用いられる最小二乗法を用いた。
ある遮蔽情報から、その遮蔽係数ベクトルgを求めて、これをSH Log演算でSH Log空間に変換してfとしたとき、fの値から最小二乗法で、その2つの重み係数a,bが求まるので、事前計算して作成するテーブルはfをキーにしてa,bを求める方針が考えられる。
しかし、これは実現が難しい。というのも、いくら登場する3Dモデルが球のみとはいうものの、球の重なり具合やその組み合わせは無数にあり、これに対応する自己遮蔽の状態gも無数にあるわけで、つまりはfも無数に存在することになってしまう。fをキーにしたテーブルはサイズが膨大になってしまい、現実味がないのだ。
そこで、さらに妥協条件を与える。それはfではなくてfの絶対値をキーにするという条件。さらに、その絶対値の上限と下限を決めてしまうという簡略化の妥協も組み込む。こうすることで、なんとかテーブル化が見込めそうに思えてくる。
妥協案としては大胆すぎるので、このままでは近似精度があまり良くない。そこで精度向上のための工夫を施す。
SH Log空間に変換された遮蔽係数ベクトルの要素のうち、絶対値が大きいのは最初の項だけなので、この最初の項のみはまじめにSH Exp計算を行うようにするのだ。絶対値が大きい最初の項の精度が上がれば、精度が向上する……これを狙うわけだ。
具体的には、SH Log空間の遮蔽係数ベクトルの最初の項と第2項以降を分解しも最初の項についてはSH Exp計算を行い、それ以降については、その大胆な2つの重み係数テーブルを用いた簡略計算を行うようにする。
この理屈を利用するためには、2つの重み係数を取得するためのテーブルを、SH Log空間の遮蔽係数ベクトルの最初の項を除いたうえで作成する必要がある
なお、このテーブルでは、キーとするfの値に絶対値の下限と上限を設定するという妥協案を適用したが、では、その条件を満たせない(範囲外の)fについてはどう取り扱えばよいのだろうか。
fの絶対値が下限上限を超えている場合、下限上限範囲に入るまで、その値を1/2にしていく。そして、下限上限範囲に入ったらテーブルから求めた係数a,bを取りだし、その値からSH Expの近似を求めるが、求めた値に対して、先ほどの1/2にした回数分だけ、Triple Product計算をするとつじつまが合うという。この理屈についての数学的な証明もここでは省略する。
遮蔽係数ベクトルの統合をSH Log空間で行い、SH Exp演算で通常空間に戻せれば、あとは陰影処理(輝度計算)を行うだけだ。これについての処理系はPSF技法と理屈はまったく同じなので、これ以降の処理については解説を省略する。
動的PRTの可能性
2002年に登場時、PRTは3Dゲームグラフィックスとは無縁な技術と思われてきたが、GPUの進化と、PRT技術そのものの進化により、3Dゲームグラフィックスへの応用への期待が高まってきたといえる。
特に3Dモデルが変形しても適用できるSHEXP技法の動的PRTは、ボーンスキニングされた3Dキャラクタにも対応できるということであり、人間や動物といった動的な3Dキャラクタ表現にも問題なく対応できることだ。これが広く活用されるようになれば、3Dゲームグラフィックスのリアリティは向上し、表現の幅もさらに拡張されることだろう。
本稿で取り扱ったPRTは遮蔽(影)に限定したテーマであったが、PRTとはもともと「光の伝搬」(RADIANCE TRANSFER)を「事前計算」(PRECOMPUTE)する一般形であるため、事前計算する要素を別のものにしたり、あるいは増やしていくことで、複雑かつ特殊な材質の表現も可能だ。例えば、皮膚のような半透明材質の表現や、二次反射光以降の複雑な相互反射の陰影処理なども可能だ。
現状のSHEXP技法の動的PRTでも、基本的に頂点単位の陰影処理となり、なおかつPRTの単位が球体近似化された形状単位になるので、細かいディテールにまで配慮した複雑な光の伝搬を再現できるわけではないが、一般的な反射モデルを用いたピクセル単位の陰影処理と組み合わせれば、そうした欠点も補えることだろう。
可能性は見えたとはいえ、3Dゲームグラフィックスに応用するには、まだまだ、処理速度やビデオメモリ容量の観点で乗り越えるべき課題は多いように思える。しかし、これはハードウェアの進歩でどうにかなる問題だ。
そういった意味において、今世代以降のPCゲーム等の先進エンジンなどでは、動的PRTの実装が始まる可能性は高い。
PRTの対象要素例。点PにおいてPRTできる要素はいっぱいある。ただし、取り扱う要素が多くなればなるほど計算負荷は高くなり、消費ビデオメモリ量は増える。しかし、これは、裏を返せば、GPU進化で解決できる問題とも言える |
(トライゼット西川善司)