DirectX Sample-Shadow Map阴影原理

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个相邻点插值是为了避免太大的锯齿




你可能感兴趣的:(阴影,DirectX)