シャドウバッファ改良

ちょっと力技で改良を試みた

void calc_shadow(inout VS_OUTPUT In)
{
	float4 c = tex2D(s3,In.FromLight.xy);
	float depth = dot(float4(1,1,1,1), c); //depth = x + y + z + w
	depth = In.FromLight.z * -4.0 + depth;
	depth *= max(In.TexShade.y * 4.0, 1.0);
	depth = clamp(4.0*depth, -0.9, 0);

	// ここらへんちゃんと最適化されない
	float d0 = -4.0 * depth;
	float3 t0 = float3(d0, depth, d0);
	float3 t1 = In.TexShade; t1.y = 1;
	float3 t2 = In.TexHL; t2.y = 1;
	In.TexShade += t0 * t1;
	In.TexHL += t0 * t2;
}

結果
今完全に型遅れのビデオカードでも1体くらいならこのクオリティでさくさく動くよ、というスクリーンショットを置くのが本来の目的だったようなきがするのでおいておく。


スクリーンショットの環境では800x800にZを書き出し、そこから3回90%縮小描画してぼかし、さらに1回描画してもとのサイズへもどしている。
256x256の小さなバッファを使っても、ジャギーの角がまるまった跡がちらちらと影の形を変化させるのを見なかったことにすれば止め絵としては割と遜色ない。