Chapter 7 – Shadows 阴影

7.5 Percentage-Closer Filtering

只要简单地对shadow map进行扩展就能得到我们在本章节开头提到的soft shadow。其还能够缓解因为采样率所造成的shadow map的锯齿问题。其解决办法类似于贴图的放大(texture magnification)。我们不再是从shadow map中提取一个采样点,而是提取距离最近的四个采样点。该技术并不会对shadow map中的四个采样点的深度值进行插值(平均),而是对每个采样点与物体表面的深度值进行比较,对于比较结果进行插值。也就是说,物体表面某一点的深度值将分别与四个采样点进行比较,每一个采样点都会对应一个结果。假设,0表示该点位于阴影中而1表示该点位于光线中,那么四个采样点的比较结果将进行双线性插值以计算出光线对于物体表面该点的影响。这一filter能够模拟出soft shadow的效果。而具体的soft shadow效果则取决于shadow map的分辨率,camera的位置和其他一些因素。例如,shadow map的分辨率较高,那么soft shadow的边界就会越窄。

从shadow map提取多个采样点并且对比较的结果进行融合,该技术被称为percentage-closer filtering(PCF)。区域光能够生成soft shadow。到达物体表面某一点的光线的数量就是该点所能“看到”的光线的数量。PCF通过“逆转”这一过程来模拟精准光源(包括方向光)的soft shadow。该技术并没有基于物体表面上某一点去计算光源的可见区域,而是在该点附近的位置去计算精准光源的可见度。如下图所示。而“percentage-closer filtering”则表示该技术的最终目的,也就是计算这些采样点对于光源的可见比率。而这个比率/百分比将用来对物体表面的该点进行着色。

左侧图片中的棕色线条表示了区域光源所形成的半影/soft shadow。对于物体表面上的点p,通过测试区域光源表面的一组点并且找到这一组点中不被遮挡物遮挡的点,以此可以计算出点p所接收的光线。右侧的图片中,点光源并不能投射出半影/soft shadow。PCF通过相反的过程来模拟出区域光的效果:对于点p,我们在其周围的shadow map上进行采样以求出这些采样点的光照率。红色的圈表示shadow map中的采样点。理论上来说,我们希望红圈的范围与阴影接受物体和遮挡物之间的距离成正比。

在PCF中,我们在物体表面某一点的周围生成坐标点,这些点的深度几乎相同,但是其在shadow map中对应了不同的纹理。我们检测每一个坐标点的可见度,在光线中或者在阴影中,并对其结果进行blend,得到soft shadow。需要注意的是,这一过程并不是“正确”的:因为我们并没有对光源进行采样,而是对物体表面的点进行了多次采样。也就是说,遮挡物到物体表面某一点的距离并不会影响结果,所以这将会导致阴影有着相似尺寸的半影/soft shadow。但是,这一技术在某些情况下能够模拟出合理的soft shadow。

当我们确定了采样区域之后,以何种方式进行采样就变得非常重要,其能够避免锯齿的问题。同时,对于filter以及采样有着多种方式。如果我们使用的API较弱,那么采样的过程类似于贴图采样的双线性插值,该技术将读取周边的四个坐标点。但是其并不会对结果进行blend,而是将四个采样点与特定的值去比较,最后返回通过测试的比率。但是,如果我们仅仅通过这种方法进行采样与filter,那么会造成明显的显示错误。因此我们需要避免在物体的边缘进行融合,这能够大大减少阴影“泄露”到其他物体上的这种情况。我们将在第十二章中学习这方面的知识。

DX10引入了单指令双线性filter对于PCF的支持,其能提供更好的soft shadow效果。但是常规的采样仍然会是一个问题。一个解决办法是尽可能减少网格模式的采样,而使用一个预计算的泊松分布(Posson Distribution),如下图所示。

上图最左侧的部分,其使用了4×4网格模式的PCF采样。最右侧的部分则表示在某一个圆形范围内的12次泊松分布。而中间的阴影便使用了该模式进行采样,但我们仍然可以发现一定的锯齿。在右侧的阴影中,每个像素在进行采样时又对泊松分布进行了随机的旋转,因此该阴影效果是最为平滑的。

在泊松分布下,各个采样点并不会以相同的模式进行排列,互相之间距离也不会太近。但是如果每个像素都使用相同的泊松分布,那么仍然会z造成锯齿,所以我们会对泊松分布进行随机的旋转。

self-shadowing和光线泄露,例如,acne和Peter Panning,在我们使用PCF时可能会更为明显。而slope scale bias将会使物体的表面基于其与光线的夹角远离光源。从单一点对一个更广的范围进行采样可能会造成一些采样点被物体表面所遮盖。

因此,引入了另一些不同的偏移因子,以减少self-shadowing的现象。Burley将其称为bias cone,其会使得采样点基于采样点自身到原始采样点的距离进行偏移。同时,Burley建议坡度为2.0,并搭配一个较小的常量偏移。如下图所示。

上图展示了另一种shadow map的偏移方法。对于PCF,我们将在原始的采样点周围,额外地进行采样,在上图中原始采样点就是居中的那个点。所有的这些采样点都应该位于光线中。在左侧的图片中,形成了一个偏移椎体(bias cone),每个采样点都需要往上偏移。而椎体的角度可以增加,使得右侧的采样点能够更靠近光线区域,但这么做可能会使得那些真正在阴影中的采样点变得位于光线中(上图中并未显示这一可能性)。中间的图片中,所有的采样点都被调整至原始采样点所在的平面。这一方法比较适合凸面体,但是对于凹面体则可能适得其反(靠左侧的采样点经过偏移之后将位于阴影中)。如右侧图片所示,法线偏移使得所有的采样点沿着表面的法线进行偏移,且偏移量与法线和光线的夹角的正弦值成正比。

由于PCF中采样区域的大小是固定的,所以阴影的soft shadow的大小都是统一的,也就是说半影部分的宽度是相同的。在某些情况下,这一效果是合理的,但是如果投射阴影的物体和接收阴影的物体在地面有接触时,其效果就显得非常怪异。

留下评论

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