Games 202 全局光照相关学习笔记


  引子:本文是“Games202-高质量实时渲染”中“Real-time Global Illumination”相关章节的学习笔记,仅供本人自己学习记录使用。

  

  一、3D空间下的GI

  1. Reflective Shadow Maps(RSM)

  原理:处理完直接光照以后,在Shadow Map中被照亮的点直接当作次级光源使用,并影响附近的点,当作间接光照照亮它们。

  做法:在Shadow Map中记录深度,世界坐标,法线,flux(光照信息?)。对每个Shading Point,在世界坐标中找到一定半径内的次级光源,计算它们对这点的贡献;Paper中做了一个大胆的假设,在Shadow Map中去寻找一定半径内的次级光源来对这点做贡献。

  优点:好实现。

  缺点:Visibility:无法判断采样的次级光源和当前Shading Point的可见性关系;有多少个直接光源,就需要做几张Shadow Map;只处理了diffuse的反射。

  

  2. Light Propagation Volumes(LPV)

  原理:把3D场景划分为若干格子,让所有次级光源进行传播迭代。

  做法:把3D场景划分为若干格子,用直接光源找出所有次级光源以后,将他们的方向,光照等信息记录在格子内,每次迭代将它们传播到周围的格子;迭代若干次以后,每个Shading Point根据当前处于的格子拿到次级光照信息。

  缺点:Light Leaking:某个几何形状比一个格子还小,那么这个几何物体的背面可能受到同一个格子另一个方向的光照,导致这点偏亮;Visibility:同RSM,不考虑传播中的可见性关系。

  笔记:这个做法因为迭代次数可能不多,所以相当于是不考虑过远点的次级光源;比起VXGI来说,有物体在动也没什么问题。

  

  3. Voxel Global Illumination(VXGI)

  原理:对场景构建体素网格,并建立Hierarchy结构,之后对每个Shading Point进行Cone Tracing。

  做法:对场景构建体素并建立Hierarchy结构,在第一个Pass中存储所有次级光源的贡献和法线信息,并更新Hierarchy层级结构;Pass2中对每个次级光源射出一个圆锥形的射线,为其他Shading Point做贡献,diffuse类型的用多个圆锥射线来覆盖亮半球。

  优点:效果好。

  缺点:比较慢;动态物体的体素化比较麻烦。

  二、屏幕空间下的GI

  1. Screen Space Ambient Occlusion(SSAO)

  原理:考虑最简单的全局光照,每个Shading Point直接加上一个常数C;在此基础上,AO大概就是对每个点根据遮蔽情况,根据对周围点的可见性关系乘上一个系数

  做法:积分推导式见PPT。对每个Shading Point,这个点被周围的遮蔽的越多,这个系数越小。在屏幕空间下,随机的对周围的点进行采样,利用Z-Buffer简单判断一下可见性,求出可见性百分比,乘以当前点的常数即可(常数为L(i) * brdf(i),L(i)是间接光源的亮度,来自于直接光源,为常数,brdf项因为假设了所有点diffuse,所以为常数)。

  缺点:由于做法导致的,会有一些错误的遮挡。

  笔记:升级版是HBAO。

  2. Screen Space Directional Occlusion(SSDO)

  原理:有点类似于RSM,但是是在屏幕空间中找次级光源,对当前Shading Point做贡献。

  做法:类似于SSAO,在周围随机找点,看Z-Buffer的遮挡关系,与SSAO相反的是,被遮挡的点,从View方向找到深度最小的点,利用那一点对当前点做出贡献;否则,可以利用环境光做出贡献。

  缺点:只能表示小范围的GI;可见性判断上不一定准确;在屏幕空间下丢失了很多屏幕外的信息。

  3. Screen Space Reflection(SSR)

  原理:在屏幕空间下,从View方向看去,对每个Shading Point做简单的Ray Tracing,来获得当前点的次级光照信息。

  做法:见原理;其中的trace过程可以在屏幕空间中构建深度的MipMap来加速tracing。

  缺点:会丢失一些反射中的模型信息(因为只有屏幕中的信息);同样的,因为只有屏幕空间的信息,在边缘外的会被截断(可以利用距离反射点越远,越虚化来做处理)。

  笔记:假设了brdf是diffuse的;处理了遮挡关系。