在direct 3d中实现shadow map的步骤

检查硬件兼容性

 

定义一个d3d texture作为shadow的render target,一个d3d surface作为shadow map的depth scentil

 

创建shadow map的render target

 

创建shadow map的depth scentil

 

不要忘记在适当的时候销毁资源

 

接下来在渲染帧的时候,将shadow渲染到render target,但要注意场景的变换是依据光源的

 

渲染实际的场景,但要在pixel shader中判断是否需采用diffuse还是ambient

 

渲染shadow map的vertex shader,其实质就是将顶点变换后的zw保存到texcoord0,那样的话在pixel shader中就能收到已经插值好的值

 

渲染shadow map的pixel shader,实质就是将z/w的值保存到render target的对应R32F上去,且这里只有一个red值

 

渲染场景的vertex shader

  • 计算必要的顶点变换
  • 实现将diffuse color计算好,避免pixel shader中计算
  • 还要将顶点的光源(shadow map中使用的)变换计算并输出,可以利用float4 texcoord1的通道来保存

 

渲染场景的pixcel shader

  • 将light变换之后的position重新映射到shadow map,并比较大小来判断当前像素是否处在阴影中
  • 由于浮点数存在误差,需要使用+ SHADOW_EPSILON来加大像素与shadow map中的距离
  • 取shadow map像素时可以使用2x2插值来削尖锐化现象

 

注意:这里的SHADOW_EPSILON的大小,应当与shadow map中一个pixel在实际场景中所占的单位来决定,小于这个单位的话,会在模型表面出现“颗粒”,这是因为场景模型中的这个点位于shadow map中的那个平均值depth之后

 

myd3dlib中实现shadow map的截图,效果并不明显,这里只是演示了self shadow cast

http://myd3dlib.googlecode.com/svn/wiki/screenshot.jpg

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值