文章

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光照传输

1740961941876

p项提前,L项用sh函数表示,li系数提取到积分外,light transport项作为系数,和Bi再次组成sh函数

1740961957711

方程中的lighting和light transport,都用sh基函数表示,变成双重求和

Specular部分2种分解方式:

p项并非常量,不可以提取到积分外,且依赖于视角O

1740961981775

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哪个角度看结果都是一致的

1740986475703

贡献值

要对p点shading,我们要从半球所有立体角采样,我们在101提到,这样的话很浪费很多的sample,因此应从光源处采样

如图所示,从半球所有立体角采样,转换为pq(光源到shading point)radiance的采样

一个次级光源q对p的贡献值:

1740987283308

1740987434876

其中因为次级光源是diffuse的,因此f项为常数(图2),Li(图2)和Da刚好会被抵消,即Ep

注意这里是2次非4次

忽略可见性

常规思路是为每个次级光源按照pq方向算一次shadow map,但这个性能开销非常庞大(想象每个次级光源对场景中任何一个点p都生成一个SM),其他也没有什么好的方法,因此不考虑可视性了

贡献权重

1740991604872

如图所示,左上为光源,黄色范围为光照区域(可以用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

在已知假设下分解简化

1741144666201

首先对rendering equation根据对product integral的近似,将V项拆分出来

1741144997900

对于V项部分,将dwi拆成sintheta dtheta dx,之后对theta和x分别积分得到的结果是pai,简称ka,实际意义是从一个点往所有方向看去按cos加权平均的平均visibility

对于costhetai dwi部分可以理解为:单位球上的面积投影到了单位圆上

1741145003436

对于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值,那么它就是遮挡因子

可以想象例如墙角处,对于从墙体内部到墙角点方向,不会产生间接光照,只有从外部方向,才有可能包含间接光照

问题

1741155105567

1741155110429

1· 我们可以看到这个红色点,它在深度测试时被判定为遮挡因子,但实际上这个方向是可以作为p点的间接光源的,从而就如同这个地面,它所在的位置正常不应该被椅子遮挡,但是以地面p作球体随机点,深度测试都是 > 椅子的,因此会有大量的遮挡因子,因此看起来灰蒙蒙的

2· 现在每个点的权重都是一样的,未进行加权,可以根据法线和向量(p到随机点)点乘,夹角越小权重越高

3·法线的后半面部分是对p点没有影响的,不应该取考虑它,因此我们只需要根据法线方向计算半球

4· Sample数量越多效果越精确,但是可以用少量的Sample,得到一个noisy的结果,然后再这个noisy的结果上进行一个denoising去噪(比如模糊)来实现降噪

本文由作者按照 CC BY 4.0 进行授权
本页总访问量