shadow map生成阴影分2步
生成shadow map
shadow map生成采用灯光所在的摄像机,记录的是场景中物体在灯光摄像机中的深度信息,0(靠近摄像机)-1(无穷远):
深度信息的计算采用绘制场景投影变换以后忽略的参数z:
投影矩阵生成如下:
D3DXMatrixPerspectiveFovLH( &g_mShadowProj, g_fLightFov, 1, 0.1f, 100.0f );
D3DXMatrixPerspectiveFovLH函数生成的g_mShadowProj计算公式为:
xScale 0 0 0
0 yScale 0 0
0 0 zf/(zf-zn) 1
0 0 -zn*zf/(zf-zn) 0
其中:
yScale = cot(g_fLightFov/2)
xScale = yScale / aspect ratio
这样,shadow map中记录的深度值通过投影变换以后的z/w得到
采用上面的公式,可以得到z/w = (z-zn)zf/((zf-zn)z) (z=zn时为0, z=zf时为1)
绘制shadow map采用VertShadow和PixShadow,都很简单
使用生成的shadow map绘制场景
上面得到的灯光视角的shadowmap信息保存在g_pShadowMap中
采用VertScene和PixScene绘制场景
VertScene除了计算正常的顶点信息,还有一个vPosLight,表示在灯光坐标中顶点坐标
PixScene中vPosLight的x、y值作为shadowmap的索引,计算出保存在shadowmap中对应的深度值,与当前点计算出的深度值(vPosLight.z/vPosLight.w)进行比较,如果不匹配,则说明产生阴影。例子中采用4个相邻点插值是为了避免太大的锯齿