Games202(4·第7章,第8章)
第7章
PRT(Precomputed radiance transfer)预计算辐射传输
我们这次考虑了阴影可视项V,其中使用PRT方法
PRT vs. 直接采样
PRT的核心思想是预计算,利用基函数(例如SH,Wavelet、Zonal Harmonics、Spherical Gaussian、Piecewise Constant……)计算数据并存储起来,
优点:从而降低运行时的性能开销,适用于环境光等复杂光照效果
缺点:存储量大,仅适用于静态场景,支持光源旋转
直接采样通过随机/有偏采样(例如蒙特卡洛方法)计算数据
优点:支持动态场景
缺点:计算量大
sh vs. Wavelet
sh: 仅对低频友好,但由于旋转不变性,支持光源的旋转
Wavelet:支持全频,但是只有很少的系数是非零)(递归左上低频数据,其他3部分保留高频数据,不支持光源的旋转
Diffuse部分2种分解方式:
我们首先将rendering equation分为两部分,lighting光照 和 light transport光照传输
p项提前,L项用sh函数表示,li系数提取到积分外,light transport项作为系数,和Bi再次组成sh函数
方程中的lighting和light transport,都用sh基函数表示,变成双重求和
Specular部分2种分解方式:
p项并非常量,不可以提取到积分外,且依赖于视角O
L项用sh函数表示,li系数提取到积分外,light transport项作为系数(V,p(o), max),和B(O)再次组成sh函数, 即T(o)
可以理解为light transport投影到Bi上
还可以用双重求和表示, 可以理解为Product Integral(乘积积分)指对两个函数的乘积在某个域上求积分: ∫(Ω) f(x)⋅g(x)dx, 即L(o) 和 T(o)
PRT Glossy比Diffuse 效率要差很多,将会产生巨大的存储
问题
有人会疑问既然场景不能改变,光源只能旋转,那么摄像机可以改变吗?
可以的,因为摄像机的改变并不影响场景的V项,V项取决于场景布局和光源位置,和摄像机无关
Reflective Shadow Map(RSM)反射阴影贴图
光线在场景bounce弹射多次形成Global Illumination (GI)全局光照,在实时渲染中,全局光照是比直接光照多一次bounce的间接光照.也就是经过2次物体bounce到达eye
在101 path tracing时讲了,tracing的物体可以被当作次级光源(Secondary Light Sourse)来照亮其他物体
如果想要计算点P的shading,需要知道哪些表面作为次级光源,对于的贡献值是多少
假设
RSM中假设所有的反射物都是diffuse的,因此不论从camera哪个角度看结果都是一致的
贡献值
要对p点shading,我们要从半球所有立体角采样,我们在101提到,这样的话很浪费很多的sample,因此应从光源处采样
如图所示,从半球所有立体角采样,转换为pq(光源到shading point)radiance的采样
一个次级光源q对p的贡献值:
其中因为次级光源是diffuse的,因此f项为常数(图2),Li(图2)和Da刚好会被抵消,即Ep
注意这里是2次非4次
忽略可见性
常规思路是为每个次级光源按照pq方向算一次shadow map,但这个性能开销非常庞大(想象每个次级光源对场景中任何一个点p都生成一个SM),其他也没有什么好的方法,因此不考虑可视性了
贡献权重
如图所示,左上为光源,黄色范围为光照区域(可以用SM平面来表示,每个pixel为光源的一个方向,每个方向都是一个次级光源),x为着色点
对每个p点找到所有次级光源计算贡献,仍然是非常大的开销,为了加速这一过程, 我们认为SM的所有pixel不可能都有贡献,因此仅查找x在SM上临近范围(p红色平面范围内),差不多采样400个次级光源
且为了弥补越往外采样数越少可能会带来的问题,引入了权重,越近的权重越小,越远的权重越大
数据存储
在每一个像素中都需要存储深度值,世界坐标,法线,反射光功率
第8章
light propagation volumes LPV光传播体积
LPV同PRT和RSM一样都是实现GI的方式,LPV可以很好的解决一部分RSM的问题. 它快速且高质量
steps步骤:
- 生成(找出接收直接光照的点)
- 注入(inject到3D网格作为次级光源)
- 传播(网格中传播radiance)
- 渲染(渲染场景)
问题1
但是由于体素有相对大体积,p点不应该接受到光照,但是会接受一个体素内的环境光,因此会被照亮,也就是漏光问题,解决方式:
- 一种解决方式是划分的格子足够小,但是会导致数据量增多,可以用Cascade层级加速结构来优化它的性能
问题2
场景中所有材质都假设为diffuse
voxel global illumination VXGI体素全局光照
steps:
- light pass:
- camera pass:
和视角的方向、以及p点材质、次级光源材质都有关,支持了glossy的材质
screen space Ambient occlusion SSAO屏幕空间环境遮蔽
它是基于屏幕空间计算的GI,假设任何shading point接受的环境光照都是一致的常数,但是对应的V项是不同的,假设每个物体都是diffuse的
也就是说我们要知道p的V项值 * 环境光照的值,就可以知道p点GI
在已知假设下分解简化
首先对rendering equation根据对product integral的近似,将V项拆分出来
对于V项部分,将dwi拆成sintheta dtheta dx,之后对theta和x分别积分得到的结果是pai,简称ka,实际意义是从一个点往所有方向看去按cos加权平均的平均visibility
对于costhetai dwi部分可以理解为:单位球上的面积投影到了单位圆上
对于L和F项,假设了所有方向的间接光照是一个常数,因此L项是常数,假设了物体是Diffuse的,因此F也是常数,因此这部分其实就是自定义的任意值
结果:
p点GI == 加权平均V * 自定义值
求V
一种思路是从p点往四周trace追踪光线
p点受到的遮挡肯定是在一定范围内的,及远的距离是不会影响到p点的,因此我们只要在某个合适的范围内计算V和Gi值
但是限制的范围不能太大,假如限制在一个封闭的房间内,房间内的点p在所有方向都是遮挡的,即V == 0,因此p点的GI == 0,但正常情况下,房间是有光的,房间内的p都是有颜色的
同样限制的范围不能太小,因为范围外的间接光照都会被忽略
SSAO的做法
但是以p点往四周trace光线是很麻烦的,因此SSAO做了聪明的假设
在以p点为圆心,r为半径作球体,在内部随机撒点,在物体内部的点作为遮挡因子,外部的点作为非遮挡因子,
也就是根据camara的深度图,如果随机点的深度 > 深度图的depth值,那么它就是遮挡因子
可以想象例如墙角处,对于从墙体内部到墙角点方向,不会产生间接光照,只有从外部方向,才有可能包含间接光照
问题
1· 我们可以看到这个红色点,它在深度测试时被判定为遮挡因子,但实际上这个方向是可以作为p点的间接光源的,从而就如同这个地面,它所在的位置正常不应该被椅子遮挡,但是以地面p作球体随机点,深度测试都是 > 椅子的,因此会有大量的遮挡因子,因此看起来灰蒙蒙的
2· 现在每个点的权重都是一样的,未进行加权,可以根据法线和向量(p到随机点)点乘,夹角越小权重越高
3·法线的后半面部分是对p点没有影响的,不应该取考虑它,因此我们只需要根据法线方向计算半球
4· Sample数量越多效果越精确,但是可以用少量的Sample,得到一个noisy的结果,然后再这个noisy的结果上进行一个denoising去噪(比如模糊)来实现降噪