简单理解就是已经被照亮的点作为光源再去照亮别的点

在3D空间的全局光照
Reflective Shadow Maps(RSM)
用非直接光照照亮点p需要什么:
- 那些点被光源直接照亮(从shadowMap中得到)
- 其他点对点p的贡献是什么
shadowMap中每个纹素就是一个面光源(因为shadowMap描述的就是那些地方被直接照到),紧接着要求p点的间接光照其实就是求shadowMap每个纹素代表的面光源对p点的贡献
把纹素作为面光源来求渲染方程
现在问题就是从纹素反射出来的Radiance如何计算
- BRDF项在当前场景中认为是diffuse的

- BRDF可以认为是出射的Radiance与入射的irradiance的比例,所以L可以算出
这样写的好处是带入渲染方程后把dA项消掉了,这样就不需要patch的面积大小了,公式就变成了
有几个问题: - V项没了,因为计算量太大,要计算对于每个着色点从任何一个纹素看向着色点是否被遮挡
- 方程下边变成4次方,是论文作者对距离衰减做了平方衰减处理,课程中说这是错的,应该是平方,如果说错了直播吃键盘😄(看到第9节课,老师真吃键盘了)
有一些纹素一定不会对着色点有贡献 1. 可见性 2. 方向 3. 距离
这个问题就引出了这篇论文的假设,如何知道那些纹素离着色点比较近,论文中认为在shaowMap上比较近,那么世界坐标下就离的比较近(大胆的假设)
RSM需要存储的东西
RSM在工业界通常用在手电筒
RSM的优点:
- 易于实现 缺点:
- 直接光源有多少就得有多少张shadowMap
- 可见行没法做
- 很多的假设
- 采样率和质量的tradeoff

Light Propagation Volumes (LPV)
关键点:Radiance沿直线传播时不会发生变化z
关键做法:把整个场景体积进行切割,成为一个个体素(类比纹素)
下图红色箭头就是间接光照的来源,就是求黄色点接收到的红色radiance的计算
步骤:
-
那些点接收到了直接光照
-
把这些点放在场景到的一个网格中
-
在网格中传播radiance
通过RSM得到一系列虚拟光源
对场景划分3D网格(可以使用3D纹理,定义每个UV是3D空间的哪个网格)
计算一个格子中向任何方向上的radiance是多少,并用SH压缩,LPV需要存储场景中每个体素(voxel)的辐射度分布,直接存储全方向的辐射度会导致内存爆炸。通过SH投影(通常用2阶或3阶),可将6D的光照函数压缩为少量系数(如9个或16个),极大降低内存需求。
这一步我理解就是把每个次级光源都归为了每个网格的属性,这里记录了每个网格向各个方向的Radiance
一个格子的radiance向上下左右方向进行传播,这一步结束后每个格子的radiance就都记录好了
对于一个着色点来说,就可以直接使用当前格子接受到的Radiance来计算间接光照了
但是有问题,墙的一边不可能照亮墙的另一边,那把一堵墙放在同一个网格中,那计算着色时墙两边的Radiance都会被考虑,就会出现漏光
这样就会出现漏光现象,这就要考虑网格划分粒度了

Voxel Global Illumination (VXGI)
把整个场景网格化,想象成MC用方块搭起来的场景,并做了层级处理,比如上一层的一个格子在下一次划分为8个格子,最终建立起一颗树
第一步:用RSM的方法找到直接光照的网格,并记录每个网格接收到的光源的入射方向和法线,并更新到各个层级,高层级整合低层级的光源入射方向和法线
开始着色:
对于glossy的着色点,光源到达后会反射为一个圆锥的范围
从着色点发射锥体,沿锥体轴线步进采样。看场景中那些体素在椎体范围内,那它就对该着色点有贡献(这是利用光路可逆的思想,反过来这些碰到的体素就会通过椎体射到着色点)
对于diffuse的着色点

在屏幕空间的全局光照
屏幕空间:只使用屏幕信息,对图像进行后期处理
Screen Space Ambient Occlusion(SSAO)
一种全局光照的近似
key diea 1:
- 不知道间接光照,假设为一个常数
- 但不是所有方向都能接收到,会被别的物体挡住
显然AO的环境光更好
经典从渲染方程中解释
把V项拆出去了,拆出去的(蓝色)项就像当于把四面八方的可见行进行了平均,剩下的(橙色)项中L项在SSAO中已经假设为常数,另外还假设BRDF是diffuse的,所以全是常数了
其中cossita还没解释
用cos项把球面上的积分转为圆面上的积分(把立体角的面积投影到底面圆上进行积分)
数学结束,SSAO就是把间接光当常数、BRDF也是diffuse的
理论分析结束,现在问题就是如何在屏幕空间求一个着色点四面八方看哪些地方被挡住了
SSAO假设任何一个着色点在周围半径为R的球中进行采样,每个点与对应像素的zbuffer进行比较,如果大,说明这个点被挡住了就是红色
但是上图有一个点判断错了
用一整个球来采样还有问题,墙体内部的点不需要考虑,只需要半球采样即可
采样越多越准确
AO做法是先低采样得到AO
然后进行模糊
SSAO的一个问题是会出现假遮挡现象,因为在摄像机视角下,看着被遮挡了,但实际上两者距离是很远的
进一步有技术叫HBAO,只考虑一定范围内的遮挡
Screen Space Directional Occlusion(SSDO)
是对SSAO的提升,SSAO考虑间接光照是是一样的,但是通过RSM,我们是可以求出间接光照的
下图看出AO只是简单的变暗,而DO考虑的反射物的颜色,让阴影变蓝了

与SSAO想法相反,DO认为如果打出去的光线没有物体挡住,那它才应该没有间接光照的贡献,只有直接光照的贡献,反而打到的物体才会反射回来光
实际做法也和SSAO一样,半球面采样,使用Zbuffer来判断采样点是否被挡住,下图ABD点都得到是被遮挡了
考虑ABD的间接光照对C点的贡献
DO也有假遮挡问题,A点没有被挡住,但是从视角上看是被挡住了,所以被认为对C点有间接光照贡献
只能做小范围的全局光照

Screen Space Reflection(SSR)
在屏幕空间中做光线追踪
现在在屏幕空间已经有了红框的东西,现在SSR就只需要加上白框的东西
SSR的思路
Linear Raymarch
目标是找到光线与场景的交点
- 选定步长,每走一步检查深度
还有加速方法,首先对zbuffer生成mipmap
但与常规mipmap不相同,上一层级的一个像素是下一层级4个像素的最小值,而不是平均值
存最小值的目的就是,如果一个光线与上层不相交,那下层更不用考虑了,因为下层离得更远
算法为首先走一步,每交点,就胆子大一点就在上一层一口气走两步,还没交点走4步,有交点了再慢慢走
SSR也有问题,因为屏幕空间只有最前面的数据,所以藏在背后的但是反射出来应该能看见的物体就渲染不出来了

