动态实时阴影技术总结

Shadow map

基本实现思路两遍Pass:
1.光源做为相机渲染一遍场景保存深度信息
2.正常渲染的时候将坐标转换到上面的坐标系进行深度比较,如果深度大于shadow map,则表明这个点被遮挡

只要是shadow map就会有两个严重的问题,第一个是自遮挡,第二个是锯齿,这两个问题的本质是因为shadow map的分辨率太低。因为shadow map贴图的分辨率过低,阴影贴图的一个纹素会对应多个像素,而这些像素在shadow map空间中的深度是不同的,因此就会出现自己遮挡自己的情况。如果太阳刚好在头顶正中央,水平面的地形其实不会出现自遮挡,因为所有的像素对应的深度值是一样的,但是如果太阳是掠射的,那么这些像素之间的深度差距就变大了,因此自遮挡的现象就会比较严重,另外如果分辨率差距比较大,那么一个纹素会对应更多的像素,自遮挡的现象也会比较严重,综上自遮挡的严重程度与光源的方向及分辨率的差距有关。解决自遮挡的方法是加一个偏移量,但是这个偏移量如果加的太大阴影会和物体分离。另外一个问题是阴影锯齿,为了对抗这个问题,人们想了很多算法,另外这些算法的附带效果就是可以实现软阴影。

CSM

第一个想到的办法就是用多张shadow map贴图来表示整个场景,对于接近相机的部分使用高分辨的贴图,远离相机的部分使用低分辨率的贴图,这个就是CSM算法的核心。

PCF

这个算法源于抗锯齿,当然在这里不是对最终的图像进行抗锯齿,也不是对shadow map进行抗锯齿。之前我们只是取一个纹素进行深度比较,PCF则是取多个纹素进行比较,然后根据遮挡关系取一个平均值,这样就会产生软阴影的效果,从而达到抗锯齿的效果。PCF的缺点很明显需要多次采样,CSM和PCF是可以混合使用的。

PCSS

PCF算法对所有像素的过滤是一样的,但是现实中阴影距离遮挡物越近越硬,越远越模糊,因此为了提高阴影质量,人们使用了PCSS算法。这个算法的核心是我需要先算出这个像素距离遮挡体的深度,然后根据这个深度控制Filter的大小。因此我们首先采样多个点计算平均遮挡距离,然后根据这个距离决定需要多大的采样范围,最后多次采样进行深度比较。可想而知这个算法的采样次数多么可怕。

VSSM

PCSS是采用暴力采样的方法计算遮挡程度,而VSSM则是希望通过公式计算得出遮挡程度。

它先假定采样点的深度符合正态分布,然后在贴图中保存深度以及深度的平方,然后根据SAT快速计算出期望和方差,然后再根据切比雪夫不等式求出遮挡值。这个算法最大的问题就是漏光,因为你首先假定深度符合正态分布,但是一旦深度不符合正态分布就会出现各种各样的问题。但是它的运行效率很高,这个算法有几个比较秒的地方,一个是方差的计算,一个是SAT,一个是切比雪夫不等式,另外就是如何计算遮挡距离的平均深度,因为我们不知道有多少个点被遮挡,有多少点没被遮挡。

MSM

它是为了解决VSSM漏光的问题,它引入了矩的概念,通过其他数学函数来计算出遮挡值。

Distance Filed Shadow

距离场阴影,我没有用缩写是因为它不属于shadow map阵营,这个ray marching技术很巧妙,它和光栅化渲染,光线追踪渲染起名,可想而知这个东西有多厉害。它先构造一个距离场,这个场中每一个点记录了该点到场景中所有物体的最小距离,这个场保存在3D纹理中。每一个物体先在局部空间中构建一个距离场,场景的场是这些物体的场合并得到的。在局部空间构建也就意味着这些物体可以进行平移,旋转,以及等比缩放。但是物体不能变形,因为变形会导致场的信息失效,而场的生成是预处理的(很耗时),所以不支持动画以及非等比缩放。从这一点来说它是不如动态的shadow map算法的。它的算法是从着色点,发出多条射线,然后通过ray marching技术判断遮挡关系,有点类似光线追踪,但是因为距离场的存在,相交测试要比光效追踪快很多,这个技术还可以处理AO。ray marching技术的劣势是不好贴纹理,因此没有大面积使用,但是在阴影处理上没有问题,因为阴影不需要纹理贴图。

版权声明:本文为CSDN博主「隐士低手」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liran2019/article/details/118226712

最新文章