cascaded shadow map

http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf

dx sdk也有cascaded shadow map的章节。

很成熟的shadow解决方案了。

 

 

shadow的问题基本就是精度的问题。

csm就研究如何更加合理的分配shadow map的精度。

 

shadowmap最佳的精度比就是lightview里面一个像素的大小对应到shadowmap里面也是像素大小,这样不会blocky,也不浪费。

csm没法完全做到这一点,但是可以接近这一点。

就是把camera frustum分割,假如2个,那么近的一个用一个1k*1k的shadowmap,远的一个1k*1k的。

cascaded shadow map_第1张图片

结果是近处的精度高,远处的精度低,但是精度比维持在大抵稳定的一个程度。

 

在render的时候,根据view space depth来判断应该sample哪一个shadowmap。

 

 

实际应用中frustum的切割是个问题,需要根据自己游戏的类型和精度需求具体问题具体分析。

nv的文档中给一个公式倒是可以参照下(推导部分也挺不错)

根据这个来进行分配。

 

shadowmap的frustum根据camera frustum slice来调配位置和大小,使用orthogonal frustum。

 

slice之间稍有重合,避免裂开的情况。

交界处的处理

交界处常常会有不连续的情况,尤其是在树叶,草这种细密的东西,非常明显,使用交界处重合的那部分blend一下来解决,但是树叶这种还是可以看出交界处从一种精度过渡到另一种精度,这点上只能忍了。

csm和soft shadow技术是正交的,一般无所谓,vsm,pcf,esm都随意。

但是需要说的就是在交界处的处理,还是和softshadow之间有关系的,可以看下sig09 bungie的paper。

其他的是逐物体的shadow计算还是构建depth,然后全屏一次算出来shadow也是根据各个render engine来选择。


原文链接: http://blog.csdn.net/ccanan/article/details/5988052

你可能感兴趣的:(cascaded shadow map)