实时全局光照RSM-Reflective Shadow Maps(RSM)

全局光照介绍

        现实世界光处于线性空间,光照效果是可以叠加的,最终的光照结果 = 直接光照 + 间接光照,结果也被称为全局光照(Global illumination)。与之对比的是局部光照——仅考虑直接光照。那么自然在目前线性空间的渲染技术当中,同样符合光照结果 = 直接光照(direct light) + 间接光照(indirect light)。

  • 直接光:光源直接照射到物体上,后被反射进眼睛,来自被指定的光源。
  • 间接光:光经过多次弹射(至少大于等于两次)后进入眼睛,来自被着色位置正半球的所有可能方向。

        全局光照十分重要,但也比较复杂,在之前的Blinn-Phong模型中有个Ambient light光照(物体自发光),相当于给场景中的每个像素加上了一个相同的间接光照,但是实际上是不合理的,因为如下图中阴影部分面积的光照强度都是不同的。

 1.依托于硬件特性,实现全局光照的思路有两种。

  • 光线追踪
  • 光栅化

        使用光线追踪思路来渲染,便可以相当完美地处理全局效果,不仅仅是全局的光照着色部分,更能轻而易举地解决所有可能光照的阴影问题。但问题出在光追上:硬件要求高,代价昂贵,虽然实时光追硬件自2018年来已经问世良久,但光追依旧主要用于离线渲染。面对实时渲染尤其是游戏那至少30FPS(Frames per Second)的要求,光追还是望而却步。

2.在引擎当中,我们分为三个部分处理:光源直接光,光源间接光,环境光。

  • 光源直接光:光从所设光源发出经历一次弹射后进入眼睛。
  • 光源间接光:光从所设置光源发出经过多次(大于等于两次)弹射进入眼睛。
  • 环境光:通常由天空盒构成,更简单的话设置一个系数。(特别说明,这是一种不得已采取的模拟方案,现实环境中仅存在上述光源直接光和光源间接光,但我们无法模拟出地球现实如此复杂的物理环境,加入环境光近似模拟,参考IBL)

         在实时渲染中,所说的解决实时光照,其实就是解决一次或多次反射后的间接光照。人们常追求简单且快速的方法解决一次反射间接光照的问题。

        在之前的games101中有讲过 ,p点的间接光照:光源照向Q点,Q点接收光照后充当光源,再照向P点,即一切被直接光照(primary light source)照到的物体会充当光源(次级光源secondary light source)

扫描二维码关注公众号,回复: 14646091 查看本文章


直接光照和全局光照实例

在下面的场景中,用小太阳代替可以直接光照的点(图中只是示例的几个点),不能直接光照的将展示成纯黑色的场景

 将图中的小太阳将当做次级光源来照向场景中的其他物体,就可以得到直接光照+一次间接光照后的场景(全局光照)


RSM-Reflective Shadow Maps

 需要解决的问题

如果我们需要解决任一点p的间接光照后得到的结果是什么,那么我们应该先知道些什么?

(1)哪些是次级光源(哪些物体的位置会被直接光照照到)。可通过shadow map

(2)把每一个次级光源的贡献算到点p上去,那么每一个次级光源的贡献是多少?算出每一个次级光源的贡献后再求和就可以得到点p的间接光照的计算。

 

        由于需要从每一个次级光源照向点p,所以我们的观察方向是从点p来观察这些次级光源,而不是从camera来观察这些光源的。所以对于点p来说,出射方向我们不知道,所以不能算出它的shading。所以这里我们假设每一个次级光源都是漫反射(不依赖于我们观察的方向),  出射的辐射方向都是均匀的。

         light覆盖的立体角上的积分,可以转换为light区域上的积分。

        由于考虑到实时性,不可能在每一个次级光源都做一次shadow map,所以直接不考虑p点对于次级光源来说是否可见。

        并不是所有的像素在RSM中都是有贡献的,主要由三点决定:可见度,方向,距离。

图中并不是所有的点都对x点有贡献。

  • 方向上:比如点x-1在shadow map上记录的是桌面上的一点 ,但是由于RSM不考虑可见性所以记录的是x-1点,桌面上的点与x点法线夹角大于90度,所以x-1应该对x点是没有贡献的。
  • 距离上:由于光照强度与距离的平方成反比,所以距离对光照的影响很大,但是在世界坐标下两点的距离不好找,所以直接将shading point投影到shadow map上去,直接在shadow map上找周围一圈的点(在shadow map离得比较近或者深度比较近就当做在世界坐标系上比较近)。即便如此也要很大的范围遍历,所以为了提高速度,可以在shadow map上采样一些点来提高速度,具体的采样方法可以自行考虑,比如说距离点越近采样率越高,但贡献小一些,距离远一些采样稀疏一些但贡献大一些等等。


补充

在使用RSM中通常要记录深度、世界坐标系、法线、通量等信息

 RSM方法通常使用在游戏中的手电筒上

参考视频​​​​​​​

猜你喜欢

转载自blog.csdn.net/qq_48626761/article/details/127204159