|
shadow map实现
VSOUTPUT_UNLIT VS_Unlit( float4 inPosition : POSITION )
{
// Output struct
VSOUTPUT_UNLIT OUT = (VSOUTPUT_UNLIT)0;
// Output the transformed position
OUT.vPosition = mul( inPosition, g_matWorldViewProj );
// Output the projective texture coordinates
OUT.vTexCoord = mul( inPosition, g_matTexture );//纹理矩阵=[灯光视图投影矩阵][映射],后面映射不会
//影响z值
return OUT;
}
顶点程序处理,是以相机为视点的。一方面它输出位置,把数据传给光栅器处理。另一方面,原始位置乘上纹理矩阵后(以灯光为视点),这部分数据是不是放在放纹理显存中?由于场景中所渲染目标点极有可能在灯光形成视锥体外部,会不会发生裁剪?
float4 PS_Unlit( VSOUTPUT_UNLIT IN ) : COLOR0
{
。。。
for( int i = 0; i < 9; i++ )
{
float A = tex2Dproj( ShadowSampler, vTexCoords ).r;//这里vTexCoords看作IN.vTexCoord的一个值就行
float B = (IN.vTexCoord.z - 0.001f);//相对于灯光的矩离,值变小一点,是为了正确渲染
// Texel is shadowed
fShadowTerm += A < B ? 0.1f : 1.0f;
。。。
}
这里是像素程序对 以相机为视点经插值后的像素点作进一步处理。
tex2Dproj( ShadowSampler, vTexCoords ).r
一些灯光视锥体外的顶点,他们原来在顶点程序阶段是要投影灯光的近裁平面上,所认最后生成的纹理坐标,我认为自然会跑到[0,1]外面(确切地说是,[0w,w],因为tex2dproj会做透视除法,真正归一化),让人困扰的是,用跑出纹理坐标外的点去检索那张一开始就成生的阴影图,结果会如何?显卡到底隐藏了什么细节?
问题是不是可以归结为:顶点/象素着色器中 :TEXTURE0 这个标识,显示到底是如何处理它的?
有高手一不小心路过,务必点拨一下。谢谢~ |
|