バリアンス・シャドウマップ技法~効率よくソフトシャドウを得る

デプスシャドウ技法の影のジャギーをボカしてソフトシャドウ表現にしようとするアイディアは他にもある。

ここ最近、にわかに採用例を増やしているのが「バリアンス・シャドウマップ技法」(VSM:Variance Shadow Maps)だ。

VSM技法でも、シャドウマップを生成するところは全くデプスシャドウ技法そのまま同じ(それこそPSM,LSPSM技法で生成してもよい)。ただし、実際の最終的なシーンのピクセルを描画する際の、影かどうかの判定で、やや特殊な計算を行うために、シャドウマップは浮動小数点テクスチャを用いる。さらに、シャドウマップを生成する際に、光源からの遮蔽物の深度値だけでなく、その深度値の二乗の値も格納する。よって、1つの値しか格納できない1要素テクスチャではなく、一般的なαRGBで表される複数要素からなるカラー・テクスチャフォーマットにする必要がある。

最終的な視点から見たシーンの描画時には、描画する各ピクセルについて、そのピクセルから光源までの距離を求め、シャドウマップからそのピクセルと対応する光源と遮蔽物までの距離を比較し、「影か否か」の判定を行おうとするところまでは同じだ。

最大の違いは、この「影か否か」の判定に、確率論でよく用いられる「チェビシェフの不等式」と呼ばれる方程式を用いるところ。

通常のデプスシャドウ技法では、「影か否か」のYES OR NOの二値判定をするが、VSM技法ではここで「チェビシェフの不等式」を用いて「光が当たっている最大確率」を算出するのだ。3Dグラフィックスに確率論の方程式を持ってくるところがユニークだ。この影か否か判定の結果が最大確率は0~1で表されるので、この値はそのまま影の色(≒影の濃さ)として利用できる。

通常のデプスシャドウ技法において影領域の輪郭にジャギーがでやすいのは、この箇所の「影か否か判定」が難しいのに「影(0)か、光が当たっている(1)か」の二択にしてしまっていたからだ。ここを確率、すなわち実数で表せることになるので滑らかにできる。影の本体に近ければ近いほど影の確率は高くなって影は濃くなり、遠ければ遠くなるほど影の確率は低くなり薄くなる……というようなイメージだ。このように影の輪郭付近が滑らかになる……というのは丁度ソフトシャドウ表現になる。もちろん、物理的に正しい結果のソフトシャドウではないが、見た目的には強い説得力がある。

通常のデプスシャドウ技法とVSM技法との比較

さて、チェビチェフの不等式はこのように表される。

これは、分散σ2と平均値E(x)のデータがあるときに「x≧t」となる確率P()の最大値はこう計算される、ということを表した数式だ。

デプスシャドウ技法において、「シャドウマップに記録されている値(遮蔽物から光源までの距離)」>「レンダリングしようとしているピクセルの光源までの距離」となった特には光が当たっていると判断できる。

そこで、求めたい確率「P(x≧t)」において、tを「レンダリングしようとしているピクセルの光源までの距離」としてこの不等式を活用すると、確率P(x≧t)は光が当たっている確率を求めることに相当する。

分散σ2は以下のように表され、平均値E(x)はシャドウマップに記録されている値を用いて計算する。

この技法はそのままでも、影のエッジが柔らかくなるが、生成したシャドウマップに対してブラーをかけてやると、さらに影境界が柔らかくなる。ただし、このブラーを極端にかけると、影の輪郭が重なり合う箇所で、光が漏れてきているような"筋"がでてしまう。シャドウマップ側へのブラーのかけ方は、この"筋"の出方を意識しつつ調整する必要があるのだ。

さて、このVSM技法は、「影か否か判定」の工夫がメインの技法であるため、前述したPSM、LSPSM、カスケードLSPSMといったシャドウマップ生成側に工夫をしたデプスシャドウ技法の改良形と組み合わせて使うことも出来る。近場から遠いところまでは高品位に、なおかつソフトシャドウまでを出したいというときには、そうしたハイブリッド技法を活用するといいだろう。

VSM技法の代表格といえばUnreal Engine 3.0だ。画面はUE3ベースのゲーム「Gears of War」(EPIC GAMES,2006)のもの

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