本文主要是介绍在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
这篇关于在direct 3d中实现shadow map的步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!