今回はソフトシャドウをやります。
ソフトシャドウの中でも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;
ピクセルシェーダーに上記の部分を追加してください。
メインプログラムにブラーフィルターの処理を追加して下さい。
ブラーフィルター自体は何でもよいので、今回は以前紹介したものを使っています。
エラーなどがなければ下記のようにエッジがぼやけていると思います。
最終更新:2010年01月31日 18:20