阴影技术汇总

对于一款游戏来说,场景永远是最难维护的,而场景里面的地形,阴影也是最难管理的。这也是各种地形算法,阴影算法新起的根本原因。没有最优的算法,只有最优的方案,任何解决方案都是在效果和效率之间权衡和取舍。要做到这一点,前提是对相关的算法都有所了解,这里列举出阴影算法相关的技术。

 

Shadow Volume & Shadow Map:

阴影的实现主要有两种方式,Shadow Volume 和 Shadow Map,我最开始还挺喜欢Shadow Volume,因为它够精确。但事实上这是一种错误的想法,首先效率上Shadow Volume不具备可操作性,没有多少性能的提升空间。其次就是,软阴影会导致Shadow Volume精确的这个优点没有啥优势,现在主流也是Shadow Map。

 

Shadow Map:

SM的硬伤就是走样问题,这个问题会受到光源和模型的距离影响,一般距离越大走样越严重。而一般来说,室外环境产生阴影的光源正好又是离模型比较远的,这样一来SM的走样更加需要解决。

目前SM针对走样的算法有很多种变体,其中主要包括PCF,PSM系列和ASM系列。

 

PCF(Percentage-Closer Filtering) :这是一种纯粹的模糊技术,简单意味着效率高,但是它只能通过模糊的方式缓解走样,无法根治。其变种是:PCSS个人觉得这是阴影生成上的必选方案,开销小而且真实 nice!

VSM(variance shadow map 方差SM) :运用了切尔雪夫不等式,通过shadow map中每个象素的深度值期望和方差来计算灰度值。VSM会出现光渗现象,所以出现了一种弥补这个缺陷的算法LVSM

CSM(convolution shadow map 卷积) :此方法是运用基于阴影重建,因为深度测试要么为0,要么为1 ,从而可以构造出一个x坐标为[-1,1],y坐标为[0,1]的函数,对此函数进行fft变换,运用基准函数(sin和cos)来重新构建Shadow Map 。 此方法占用内存比较多,需要多个render target。直接不考虑。

PCF,VSMCSM:这三种方案具有相同点,都只是纯粹意义上的模糊,并不能解决根本问题。尽管如此,在选择阴影方案的时候需要这里的其中一种,个人更喜欢PCSS和LVSM看看效率先

 

PSM(Perspective Shadow Map 基于透视空间的SM) :在世界空间里,模型的比例是不会发生变化的,但是在透视转换的时候,近处的模型会映射的比较大,而远处的则比较小。远处比较小物体影子也会小一些,这样如果把传统的SM在view空间拍照,变成在透视空间拍照。显然可以把更多的精度留给近处的较大的物体,这种思路的正确的,而且复杂度也不高。但是呢,这种方式只能减缓走样,却不能根除,因为光离模型的距离足够大的话,即便是这样还是会出现走样的情况。在PSM基础上还发展了TSMLiSPSM两种升级版,如果要采样PSM系列的方式的话,可以采样这两种的其中一种。

 

ASM(Adaptive Shadow Maps  自适应阴影贴图) :这种处理是在拍照上下功夫,SM在拍照的时候,会直接生成光源内所有的模型的深度。但事实上并不是所有的模型都出现在视锥内,其他的就属于糟蹋了。于是采用通过场景内的模型进行反推,然后求出阴影图,这种方式需要用到四叉树对阴影图进行管理。在效果上它是治根的,但是在效率上它是拖后腿的。在ASM基础杀个还发展了ASSM,RMSMQVSMFVSMPRSMPSSM,事实上这些都不够快。

 

CSM(Cascaded Shadow Maps 级联) :虽然阴影的方案很多,但是在个才是大型场景中阴影的必选方案,它在效率和效果上都有不错的表现。巧的是,我在刚才看上面的算法的时候,就想到了这个。它的优点是什么呢?阴影走样的本质是光源离物体太远,所以要解决就需要把光源移近一点,因为我们需要的是光的方向,而不是亮度,所以光离的距离对阴影不产生影响。离近了就照不全了,找不全就把场景分成很多块进行拍照,尽管这种方式需要解决一些问题,但是它从根本上解决了走样这个问题。

 

总结:CSM + LVSM 或 CSM + PCSS 这两个方案选择谁,主要取决于LVSM 和PCSS 效果和效率上的比较,我还没有实现,貌似是LVSM效率高一些。

 

你可能感兴趣的:(技术)