はじめに
GPU Gem3 - 8.4 Variance Shadow Mapsで、シャドウマップのモーメントを計算している箇所があるんですが、
そこを行間を補って丁寧に解説するという記事です。
実際のアルゴリズム
頂点シェーダで深度値(光源から見た時のZ値)を計算しoutします。
フラグメントシェーダで補間された深度値がinされます。その値を とします。
現在のフラグメント周りでの深度値が によって決まるとします。
要するに とします。
座標系の原点を現在のフラグメントとすれば、関数 は以下のように書けます。
通常の画像処理なら、隣り合う画素から偏微分の値を計算できますが、今回は隣り合う画素の値を取得できない状態です。
ですが、同じことをもう一度言いますが、 はフラグメントシェーダが計算してくれるので心配ありません。
チェビシェフの不等式を使うには、深度値の分散と平均が必要です。
その為に の確率分布を定めましょう。
計算しやすいように は相関が無い正規分布とします。
平均は原点 で標準偏差は とします。分散は です。
この時、 の確率分布の確率密度関数は以下のようになります。
式 は2次元正規分布ですが、 は無相関なので以下のように書けます。
これから先で期待値の計算をしますが、その為に簡単な計算を済ませておきます。
期待値の計算はうっとおしいかも知れませんが、 のように閉じ括弧の下側に確率分布を明示することにします。
(下の計算も丁寧にやっているので式 ~ は不要ですね。計算苦手な人のために残しておきます。)
さて、準備は終わりました。後は を計算すれば終わりです。
1次モーメント を計算します。
2次モーメント を計算します。
以上で、深度値の が求まりました。(近似ですがね。)