VarianceShadowMaps

今回はソフトシャドウをやります。

ソフトシャドウの中でもVariance Shadow Mapsというのを今回は実装しました。

シャドウ生成技術メモにも書かれているように チェビチェフの不等式 というものを使います。

手順としては

 深度バッファの作成。
     ↓
 深度バッファにブラーフィルターをかける。
     ↓
 ぼかした深度バッファを元にチェビチェフの不等式を使って影付けをする。

という手順になっています。

深度バッファシャドウに一部修正と追加を加えるだけなので変更点のみ載せます。

まずは、CreateDepth.cgfxの修正です。
float4 ps_main( 
	PS_INPUT input
) : COLOR0
{
	float color = input.depth.z / input.depth.w;
	return float4( color, color * color /*ここの変更のみ*/ , 0.0f, 1 );
}
ピクセルシェーダーのみの修正になります。

次に、DepthShadow.cgfxの追加です。
float4 shadow = tex2Dproj( depth, input.shadowUV );
float e_x2 = shadow.y;
float ex_2 = shadow.x * shadow.x;
float variance = min( max( e_x2 - ex_2, 0.0f ), 1.0f );
float md = shadow.x - ( input.depth.z / input.depth.w );
float p = variance / ( variance + md * md );
p = saturate( max( p, input.depth.z - 0.5f < shadow.x * input.depth.w ) );

//最終的なカラーを計算する
float4 output;
output = ( totalAmbient + totalDiffuse + totalSpecular ) * p;
ピクセルシェーダーに上記の部分を追加してください。

メインプログラムにブラーフィルターの処理を追加して下さい。
ブラーフィルター自体は何でもよいので、今回は以前紹介したものを使っています。

エラーなどがなければ下記のようにエッジがぼやけていると思います。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年01月31日 18:20
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。