Chapter 7 – Shadows 阴影

7.7 Filtered Shadow Maps

Donnelly以及Lauritzen提出了对于shadow map的filtering算法,其被称为variance shadow map(VSM)。该算法将深度值存储在贴图中并且将深度值的平方存储在另一张贴图中。在生成贴图时我们就可以使用MSAA或者其他的抗锯齿技术。这些贴图可以进行blur,或者变成mipmap,等等。这样我们就能将常规贴图所使用的sample与filter技术运用于shadow map。

在本小节中我们将学习VSM的工作原理,如果想要深入学习该技术,作者仍然推荐各位老铁去阅读Real-Time Shadows一书。

VSM的深度贴图只会采样一次,并返回距离最近的光线遮蔽物的平均深度。如果该平均深度(M1,其也被称为first moment)大于物体表面某一点的深度值t,那么我们认为该点完全位于光线中。当平均深度小于物体表面某一点的深度值,那么我们将运用以下表达式:

其中pmax表示采样点在光线中的最大比率,σ则是变量,t是物体表面某一点的深度,同时M1表示shadow map中的距离最近的遮挡物的平均深度。而另一张贴图中存储的深度深度值的采样为M2,也被称为second moment,用于计算σ变量:

pmax表示一个上限。而实际的光照率p不能超过这一上限,其理论依据为切比雪夫不等式,其通过概率的理论来预测那些到物体表面的距离大于物体表面到光源的距离的遮挡物的分布。Donnelly和Lauritzen展示了一个平面遮挡物与一个深度值固定(p=pmax)的平面接受物,我们可以使用上述等式来模拟其阴影状态。

变量σ会在阴影的边界处增加。也就是说,如果深度值的差距较大,该变量也会相应增加。(t-M12将会影响光照比率。如果该变量略微大于零,那么意味着遮挡物的平均深度值相较于物体表面更接近光源,且pmax约等于1(完全位于光线中)。这一情况会发生在半影的边界。如果我们继续朝半影内部移动,那么遮挡物会更接近光源,而该变量会不断变大,p则会减小。因此在半影区域内,我们能够模拟出线性变化的半影。如下图所示。

上图中,左上角为标准的shadow map。右上角则是,透视shadow map,其在靠近camera的区域增加了shadow map的纹理密度。左下角则是PCSS(percentage closer soft shadow),基于遮挡物到物体表面的距离来模拟soft shadow。右下角则是VSM,soft shadw的宽度是固定的,每一个像素由一个variance shadow map的采样点进行着色。

VSM最大的优势是其解决了物体表面的偏移问题。但是其他数据稳定性方面的问题会影响VSM。例如,在之前的等式中,我们用将两个深度值的平方进行了减法运算,但是如果小数的精确性将会影响该等式的准确度。使用浮点数格式的贴图能够避免这一问题。

总体来说,VSM能够在较低的开销下提供质量较好的阴影效果。PCF则需要更多的采样点以避免soft shadow中噪点的问题,因此其需要更多的时间进行处理。但是VSM只需要单一的高质量采样点以计算整个区域的阴影效果并生成较为平滑的半影。这也意味着我们可以随意控制阴影的soft程度。

与PCF相同,filter核心的宽度将决定半影的宽度。通过求出接收物体表面与最近的遮挡物之间的距离,我们可以改变核心的宽度,这样便能生成效果更好的soft shadow。mipmap之后的采样点覆盖率较差,因此会产生锯齿。Lauritzen提出了使用summed-area的贴图组来生成阴影。

VSM也有缺点,就是在半影区域内,如果有两个甚至更多的遮挡物影响物体表面,且其中一个遮挡物距离物体表面更近,那么切比雪夫不等式所求出的最大光照覆盖率将不再正确。距离最近的遮挡物,只会影响部分光照,但是其降低的等式的值。这将会造成光线泄露,例如,完全被遮挡的物体仍然显示在光线中。如下图所示。

上图左侧,我们使用了VSM。右侧,场景中还有一个三角形(没有在图片中显示)在茶壶上投射了阴影,其造成了光线泄露。

我们可以在更小的区域内采样更多的采样点以解决这个问题,这将使得VSM变成了另一种形式的PCF。与PCF一样,为了得到更好的效果,我们必须牺牲性能。但是对应那些深度复杂性较为简单的场景,VSM能够提供较好的效果。Lauritzen提出了一种由美术来调整参数的方法以缓解这一问题,其将低比率的作为完全位于阴影中的点,并且将其他比率映射至0%到100%。这种方法使得光线泄露的部分更暗,但这也会造成半影的区域减小。然而光线泄露是严重的显示错误,所以我们一般使用VSM生成地形的阴影,其深度值的复杂程度较低且遮挡物较少。

使用filter技术快速生成平滑的阴影使得filter技术在shadow map中使用率也不断增加;但主要的问题仍然是解决光线泄露。Annen提出了convolution shadow map,该算法扩展了Soler和Sillion的理论,将阴影的深度编码到Fourier中。与VSM相同,这一类shadow map也能够filter。

convolution shadow map的缺点是我们需要计算并且读取多个变量,这将会大大增加代码的执行与存储开销。 to page 256…

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据