01 - 图像空间的实时全局光照算法
能解要让渲染的画面看起来更真实,那必然不能缺少 全局光照(Global Illumination,GI),它虽然复杂,但也很重要。
在实时渲染中,人们要求得到 弹射一次后的间接光 的快速简单的算法。
本文将简要介绍一下图像空间的实时全局光照方法:Reflective Shadow Maps(RSM)。
全局光照问题
要想解决全局光照问题,除了要解渲染方程外,还要弄明白 如何得到在某着色点的间接光/次级光源的着色结果 。这个问题可分为两个子问题:
- 哪些表面会被直接光照射到(求次级光源位置/分布)?
- 怎么求这些次级光源对该着色点的着色结果的贡献?
图像空间算法
在生成直接光照效果时,算法会从光源视角生成的深度图。如果全局光照算法在生成间接光照效果时,除了用到从相机视角得到的信息之外,也用到了深度图信息,但是没有用到从其它视角得到的场景三维信息,即该算法只用到了图像空间(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)