DirectX Sample-Shadow Map阴影原理

16 篇文章 0 订阅
11 篇文章 0 订阅

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




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值