版权声明:本文为CSDN博主「Papals」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
目前主流的软阴影的实现方式主要有以下几种,我们来分别的探究一下他们的实现方式并且对他们进行简单的分析。
- 通过过滤阴影贴图(PCF、PCSS)
- 预处理阴影贴图(VSM、ESM)
- 屏幕空间模糊(SSSS)
1. PCF(Percentage-Closer Filtering)
百分比渐近过滤(PCF)是一个简单、常见的进行阴影边缘反走样的技术。它通过在片段周围进行采样,然后计算 样本比片段更接近光源的比例 ,使用这个比例对 散射光 和 镜面光 成分进行缩放,然后对片段进行着色。使用这一技术后,阴影边缘看上去进行了模糊一样。
但对于较大物体的内部的采样是一个较大的浪费,我们并无法只针对物体边界进行采样,所以在性能是具有很大的瓶颈。
2. PCSS(Percentage-Closer Soft Shadow)
PCSS 是距离相关的。2005年,Fernando 发布了一种名为 百分比接近软阴影(PCSS)的有影响力的方法。 它通过搜索 阴影贴图 上的附近区域来尝试找到所有可能的遮挡物。这些遮挡物与该位置的 平均距离 用于确定样本区域宽度。随着平均遮挡物越来越 远离 接收物并且更 靠近 光线,样本的表面区域的宽度将增大。
如果找不到遮挡物,则该位置完全点亮,无需进一步处理。类似地,如果位置完全被遮挡,则处理可以结束。否则,继续对感兴趣的区域进行采样并计算光的近似贡献。为了节省处理成本,样本区域的宽度可用于改变采样的数量。 可以实现其他技术,例如,使用较低的采样率来获得不太重要的远距离软阴影。
PCSS 的算法分成三个步骤
- 首先,把目标点变换到 Light Space
- 然后,找到周围点中遮挡该目标点的点,记录其与光源的距离。
- 最后,在搜索了一定的遮挡点之后,我们会根据这些遮挡点计算出一个平均遮挡距离。如果目标点不在阴影中,平均遮挡距离为 0 ,PCSS 算法直接返回 1.0 。
3. VSM (Variance Shadow Map)
允许过滤生成的阴影贴图的一种算法是 Donnelly 和 Lauritzen 的方差阴影图。该算法将深度存储在一个贴图中,并将深度的平方存储在另一个贴图中。 生成映射时可以使用 MSAA 或其他抗锯齿方案。 这些贴图可以模糊、mipmap,放在 SAT 或使用任何其他方法。可以将这些贴图视为可过滤纹理是一个巨大的优势,因为从它们检索数据时可以使用所有采样和过滤技术。
VSM:分两遍 Pass 渲染。唯一不同的是,在第一遍 Pass 中,存储在 Shadow Map 中的是一个深度值(z-depth),而在 Variance Shadow Map 中,存储的是两个分量(two components): 深度值与深度值的平方。这可以借助占用像素的两个通道来办到(比如 R 通道放深度值,G 通道放深度值的平方)。接下来,就触及到该算法的核心:完成第一遍 Pass 后,对 VSM 进行每单位区域(比如,仍然是 2*2 为一个 range )的硬件线性滤波。滤波后每像素存储的两个分量,其意义就发生了微妙的变化:
第一个分量表示该 range 内所有像素深度值的均值,也可以看作对应的期望,即上面的 M1 ;
而第二个分量表示该 range 内所有像素值的平方的期望,即上面的 M2 。
依据 M1 和 M2 我们就可以求出该 range 的 μ 和 σ 。按照切比雪夫不等式,我们就可以估计出这片 range 内其深度值大于某一值 t 的概率上限。
第一遍 Pass 中,我们逐一计算 M1 和 M2 并存储到 VSM 中,然后对这张 VSM 进行范围为 range 的硬件线性滤波;第二遍 Pass 中,我们依然用视点角度渲染场景,对光栅化的每一像素,计算它在灯光坐标系中的深度值,并把这个值设为 t;调取 VSM 中对应位置的像素,利用 M1 和 M2 计算出 μ 和 σ ,先判断 t 与 μ 的大小关系:如果 t<=μ ,则表示当前像素的深度小于等于 range 的深度均值,则判断它没有被遮挡;否则,判断它被遮挡,这时利用切比雪夫不等式计算出 pmax(t),该值表示 range 内深度值大于等于 t 的像素个数的概率上限,这个概率可以看作比率。该比率表示光照射到当前像素的光线数量(比 t 小的像素表示它遮挡住了当前像素,也就是说光线没有射到该像素上;相反,则就表示射到了 t 上),因此,这个比率就相当于光照强度,这是一个介于 0 到 1 之间的过渡数值。用它乘以黑色,就是最后实际的阴影值。注意,我们的算法是用上限值pmax(t) 近似模拟了实际比率 p(t),但其实 pmax(t) > p(t),只不过二者相差不大。但这个误差依然会导致一些问题,会放到下面讨论。
4. ESM (Exponential Shadow Map)
略