01 - 图像空间的实时全局光照算法

能解要让渲染的画面看起来更真实,那必然不能缺少 全局光照(Global Illumination,GI),它虽然复杂,但也很重要。

在实时渲染中,人们要求得到 弹射一次后的间接光 的快速简单的算法。

本文将简要介绍一下图像空间的实时全局光照方法:Reflective Shadow Maps(RSM)。

全局光照问题

要想解决全局光照问题,除了要解渲染方程外,还要弄明白 如何得到在某着色点的间接光/次级光源的着色结果 。这个问题可分为两个子问题:

  1. 哪些表面会被直接光照射到(求次级光源位置/分布)?
  2. 怎么求这些次级光源对该着色点的着色结果的贡献?

图像空间算法

在生成直接光照效果时,算法会从光源视角生成的深度图。如果全局光照算法在生成间接光照效果时,除了用到从相机视角得到的信息之外,也用到了深度图信息,但是没有用到从其它视角得到的场景三维信息,即该算法只用到了图像空间(image space)的信息,则这该算法属于图像空间算法。

RSM

RSM(reflective shadow maps)是一种基于阴影图(shadow map)的实时全局光照算法。从光源视角生成的阴影图保存了被直接照亮的景物信息,而这些被直接照亮的景物会反射光线,间接地照亮场景。

思路

求次级光源分布

可以使用SM,通过SM可以得出哪里被直接光照亮了,每个纹素都对应一小块次级光源。确认次级光源后,还要确认它打到着色点的入射方向,这是不好确定的,因此RSM做了如下假设:

  • 所有反射物的材质均是diffuse的,这样就不必在乎入射方向了。

求所有次级光源对着色点的贡献

先回顾一下辐射度量学:

  • Intensity:一个单位立体角上对应的能量,即光源发光强度。
  • Irradiance:一个单位面积下对应的能量,即着色点接收到光源的贡献。
  • Radiance:一个单位立体角和一个单位面积下对应的能量,即光线传播时的能量。

先考虑一小块次级光源如何照亮着色点,最后的结果就是把这些贡献加起来(求积分)。为了简便计算,将对立体角的积分(dw)转换为对次级光源区域的积分(dA):

然后就能解渲染方程了:

  • 之前假设反射物是diffuse的,那么它的BRDF项和就是一个常数,Li项可这样求:

  • 对于可见性V项,由于不好计算,干脆就不计算了。

优化

减少计算量

在RSM中,不是所有次级光源都对着色点有贡献,我们可以通过如下方面加速次级光源贡献的计算:

  • 可见性:计算困难,直接选择不算,误差在容忍范围内。
  • 方向上:有些次级光源照不亮着色点。例如上图中,x是着色点,次级光源x2反射不到x上,因此这类次级光源的计算也要忽略。
  • 距离上:由于光线衰减问题,较远的次级光源无法照亮着色点,这类次级光源也要忽略。

提高计算速度

RSM为了加速着色点和次级光源间距离的比较,将着色点p和所有次级光源都投影在SM中,然后计算并比较两点间的距离,如果符合要求,就认为该次级光源对着色点p有贡献。

如果直接在SM上逐纹素遍历,效率肯定不高,可以用PCSS的思想,对SM进行块状带权采样。

存储要用的量

可以将计算时要用到的量存储在纹理贴图中:

应用

经常用于游戏中的手电筒中,它计算量小,效果真实。

优缺点

优点:容易实现,是类似于ShadowMapping算法的流程。

缺点:

  • ShadowMapping算法的缺点(性能取决于直接光源的数量);
  • 不计算次级光源的可见性(不完全真实);
  • 做了许多假设(次级光源材质均为diffuse,次级光源和着色点距离在SM上算等)
  • 采样效率和算法性能的取舍。

参考资料

  • GAMES202: 高质量实时渲染 (ucsb.edu)
  • 《GAMES202:高质量实时渲染》3 实时全局光照:RSM、LPV、VXGI、SSAO、SSDO、SSR - 知乎 (zhihu.com)