02 Real-Time Shadows

关键点

  • PCF
  • PCSS
  • VSMM
  • MIPMAP
  • SAT
  • Moment Shadow Mapping

1. Shadow Mapping


  • 在shadowmap中,场景被离散化了。在camera中的像素对应的点跟shadow中对应深度可能会有较小偏差,则为阴影。当入射越是平行表面,shadowmap中的像素范围越大,越严重。

    为此,设置一个shadowmap深度的冗余的阈值偏置。此外,这个bias可以根据角度调整。但是bias过大会丢失阴影。在工业界中是通过寻找一个好的bias来解决。

    在学术界中有一个解决方法。取最小深度与次小深度的中间深度进行比较,不采取bias。但是要求物体有厚度。此外,一个效果方法能拿到的资源很少,如1ms。
  • 此外,会有锯齿。

2. The Math behind Shadow Map


近似要求:

  • g(x)实际积分范围很小
  • g(x)比较光滑/低频
    如下等效,即在着色之后再考虑遮蔽。当只有点光源时,积分范围只有一个点,可以等效;L对于较均匀面光源,fr对于diffuse材质,则平滑,也可以等效。

3. Percentage Closer Soft Shadows(PCSS)

3.1 Percentage Closer Filter(PCF)

  • 用于抗锯齿
  • 不是对有锯齿的阴影也不是对shadowmap做filter。
  • 对shadowmap上一个范围内的深度与目标位置做遮挡判断,然后对结果做平均(可加权)。

3.2 Percentage Closer Soft Shadows(PCSS)

  • 当filter小,阴影较硬,反之较软。因此可以通过调节filter实现软阴影。
  • 在不同的位置,阴影的软硬不同。阴影的接收位置离其投射位置越远,则阴影越软,即与遮挡物的距离blocker distance有关。
  • 通过相似三角形,可以得到filter大小。
  • dblocker是平均距离,即该点的所有遮挡物(shadowmap的一片区域)的平均深度。查找到一个shadow point的dblocker之后,同PCF。
  • 可见,PCF的filter对性能有要求,而PCS计算filter大小又会造成新的性能要求。

3.3 A deeper look at PCF


3.4 Variance Soft Shadow Mapping(VSSM)

对Blocker search与PCF做采样加速,这样会有噪声,所以接着在图像空间降噪。

(1) 加速PCF

  • 对于PCF,是想要得到在卷积窗口内部比shadow point更深的点的占比,相当于想要得到shadow point的深度排名。
  • 想要得到在一个系列中的排名,之前是对所有对象做对比。但是如果知道系列的分布,那么就可以直接得出结论。进一步的,假设是正态分布,就可以估计排名。因此,需要拿到均值与方差。如果对这个区域的均值与方差快速拿到就可以得到计算结果了。
  • 均值:MIPMAPSimmed Area Tables(SAT)
  • 方差:使用一个shadowmap记录距离x,并同时用另一个shadowmap记录平方。利用均值得到方差。
  • 得到分布后就可以得到概率分布函数,相应的就可以得到排名。(没有解析解,但是在c++中有数值解ERF函数)但是计算还是比较复杂。
  • 切比雪夫不等式:不再考虑是否是正态分布,对于任意分布都满足该不等式。此处利用该不等式作为约等式来作为近似估计。当然该不等式要求t大于均值,实际上默认满足。

此处假设非遮挡物的深度与shadow point深度一样,这是因为一般是表面,如果未遮挡则很可能是同一表面。

(3) 均值计算

  • MIPMAP
    不准确。
  • SAT for Range Query
    预计算一张表SAT,每个值都是以左上角为起点矩形。

  • 每次生成shadowmap都要重新计算mipmap与sat。

3.5 Moment Shadow Mapping

  • 当分布不能用高斯描述时,描述就会不准确。

    当描述不准确时,可能使得阴影更黑或者更白,后者是不可以接受的。

    如图所示,出现这种明显的分层分布的情况,就会产生漏光light leaking。

    因此,希望能够解决VSMM中分布描述问题。
  • Moment Shadow Mapping

4. Distance field soft shadows

  • 使用距离场保存每个空间点到任意物体的最近距离,即安全距离
  • 从shadow point到光源的方向上,逐步访问距离场可以得到一系列安全角度
  • 使用最小安全角度表示shadow point的被遮挡情况,即亮度
  • 一般不去计算反三角函数,因为计算量较大,所以直接比较正切值
  • 在正切值上乘以系数k,并且做clamp,可以调整阴影的软硬情况;k越大,则被clamp的安全角上限越小,则软阴影范围i越小,阴影越硬。
  • 如果不计入距离长生成,那么其速度更快
  • 距离场可以首先每个物体单独算,然后取最小值






来源

Games202

posted @ 2023-04-29 12:58  ETHERovo  阅读(32)  评论(0编辑  收藏  举报