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的;处理了遮挡关系。