Games202-4 Real-time Global Illumination(Screen Space)
a). Screen Space Ambient Occlusion(SSAO)
a.1). Introduction
- SSAO: 在屏幕空间中,对全局光照的近似;
Key idea:
假设各方向间接光照的强度相同(类似于Phong模型中的Ambition light)
考虑不同着色点,有不同的Visibility
假设材质为diffuse
假设间接光照来自于比较远的地方。因此,橙色的光线,即一定范围内不被遮挡的光线会贡献间接光。(如假设间接光来自比较近的地方,则是红色射线方向贡献间接光)
a.2). Theory
通过不等式,拆分渲染方程为:
- $k_A$ 项代表不同方向Visibility的(加权)平均
黄色框可用一个Constant color表示
- 假设了间接光 $L_i^{indir}$ 各方向强度相同,因此为常数;
- 假设了材质为Diffuse,因此BRDF为常数;
- $cos\theta$ 半球积分为$\pi$
同样,因为黄色框,即$g(x)$为常数,其Support极小。因此,应用该不等式是精确的
- A deeper understanding 1:
A deeper understanding 2:(为什么Visibility项会有$cos\theta$)
加上 $cos\theta$ 的含义是把积分域从单位半球投影到单位圆上(Projected solid angle);
为什么要这么做呢?
a.2.1). Simpler understanding
- 那么,我们怎么算 $k_A$ 项(不同方向Visibility的(加权)平均)呢?这就是AO算法实现的,如SSAO;
- 在计算AO时,我们计算的Visibility是限制在一定半径内的一个半球的局部遮挡。如在封闭的区域,如室内,如不限制半径,那Visibility将会为0。因此需要限制半径。
a.3). 实现
屏幕空间环境光遮蔽,全称Screen Space Ambient Occlusion,一种用于计算机图形中实时实现近似环境光遮蔽效果的渲染技术。通过获取像素的深度缓冲、法线缓冲以及像素坐标来计算实现,来近似的表现物体在间接光下产生的阴影。
做法总览(详情见百人计划图形4.2 SSAO):
在法向半球内随机采样,采样点 $p$ 的深度$Z_p$与 点$p$ 在屏幕空间中对应位置 点$p’$ 的Z-Buffer中的深度$Z_{p’Zbuffer}$比较。
- 如 $Z_p>Z_{p’Zbuffer}$,说明该采样点被遮蔽(红点),Visibility为0;
- 如 $Z_p<Z_{p’Zbuffer}$,说明该采样点可见(绿点),Visibility为1;
Cons:
由于是通过屏幕空间像素坐标和Z-Buffer取近似场景,只模拟了离屏幕最近的表面,对于一些点(如箭头所指的红点)的Visibility会误判;(从着色点看向该点可以看到,但SSAO中却将该点视为被遮蔽)
没有$cos\theta $ 项的加权,因此在物理上是不准确的;
[^SSAO]: 经过滤波后的SSAO
$$
k_{A}=\frac{\int_{\Omega^{+}} V\left(\mathrm{p}, \omega_{i}\right) \cos \theta_{i} \mathrm{~d} \omega_{i}}{\pi}
$$
- 采用了$cos\theta $ 项的加权的算法:Horizon based ambient occlusion(HBAO)
由于SSAO中未考虑深度比较时采样点深度和Z-Buffer深度的差值,造成相距比较远的物体之间也会存在AO (HBAO解决了)
b). Screen Space Directional Occlusion(SSDO)
b.1). Introduction
- An imporovement over SSAO;
- 考虑了更准确的间接光照(不再假设各方向的间接光照相同)
- Key idea:
- 考虑了更准确的间接光照
- 使用已知的间接光源信息
- 如RSM得到的Secondary Light Source 的flux等;
效果: 间接光照更为准确,出现了color blooding
做法:(与Path Tracing非常相似)
- 着色 $p$点 时,发射随机光线;
- 如未被遮挡(无交点): 该点受直接光照影响(如Ambient Light);
- 如被遮挡(有交点): 该点受间接光照影响;
- 着色 $p$点 时,发射随机光线;
b.2). 实现
与SSAO相比: SSAO为被遮挡的光线的方向为间接光照贡献方向,SSDO则是被遮挡的光线方向为间接光照贡献方向;
(SSAO)假设间接光照来自于比较远的地方。因此,橙色(被红圈圈起来的)的光线,即一定范围内不被遮挡的光线会贡献间接光。(如假设间接光来自比较近的地方(SSDO),则是红色射线(被橙圈圈起来的)方向贡献间接光)
- 间接光照的计算则可采用RSM、或者LPV、VXGI等;
具体做法:
和SSAO类似,在着色点P周围,一定半径的法向半球内进行随机给出采样点(A、B、C、D……),并和Z-Buffer中的深度进行比较;
如$Z_{sample} > Z_{sample\, Z-buffer}$ ,说明该点(A、B、D)被遮挡,该点则会对点P贡献间接光;
判断: 贡献间接光的Patch的方向是否会能贡献到,如点A ,${Normal_A}\cdot \vec{AP} < 0$ ,则该点不贡献间接光;
Reflector的反射方向只在法向半球上,法向半球的方向覆盖不到的Shading Point自然不受该Reflector的影响
如$Z_{sample} < Z_{sample\, Z-buffer}$ ,说明该点(A、B、D)未被遮挡,该点则不会对点P贡献间接光,而是贡献直接光(Ambition Light);
缺点: 如上图最右
b.3). Issues
只能计算小范围的AO;
是通过采样点深度和Z-buffer比较得出Visibility,而不是从P点出射光线计算交点,导致Visibility不精准;
屏幕空间的通病: 失去了屏幕中未被显示(如屏幕外)的表面的信息;
- 屏幕空间只能表现场景最表面(Depth最小)的一层“壳”;
c). Screen Space Reflection(SSR)
c.1). Introduction
What is SSR?
- Still, one way to introduce Global Illumination in RTR;
- 执行上为光线追踪;
- 光线追踪的求交并不要求3D图元,而是屏幕空间的一层“壳”(通过Z-Buffer还原的场景)
Two fundamental tasks of SSR:
- 求交:任何光线和场景;
- 着色:交点对Shading point的贡献;
效果: 可实现Specular reflection和Gloosy reflection;
- 对于Specular只用追踪镜面反射方向即可;
- 对于Gloosy知道BRDF后需追踪入射方向的Lobe;
c.2). 实现
Two fundamental tasks of SSR:
- 求交:任何光线和场景;
- 着色:交点对Shading point的贡献;
c.2.1). Intersection(求交)
使用光线步进(Raymarch),那么如何确定步进的步长?
Hierarchical tracing
- 不想一层一层步进,而是允许时步长变大;
Hierarchical tracing
Step1: Generate Depth Mip-Map(使用最小池化,而不是平均)
取最小: 如2x2的像素中,取最小深度值作为下一层该位置的深度;
最小池化构造出类似与KD-tree的结构;
逻辑: 取最小后,如果光线不和父(更大的)节点相交,那就不会和子节点相交;
P-Code
- 开始在Mip0层步进
- 没交点则进入下一层Mip(父节点);
- 有交点则进入上一层Mip(子节点),并在交点对应位置的子节点继续求交;
- 直到找到Mip0层的交点,结束循环;(演示看PPT)
- 开始在Mip0层步进
c.2.2). Shading
Shading过程和Path tracing相似;
- 假设: Reflectors(反射物)/ Secondary light source是Diffuse的
- 原因: 生成Shaded场景时,只知道屏幕空间下一个点的Radiance(即Shading Point到Camera的Radiance)。如假设Reflector为Diffuse,那么该点的$L_i$就为framebuffer中的颜色;
c.2.3). 效果
可实现锐利或模糊的反射;
Contact hardening(接触的地方反射较为锐利,类似PCSS)
Specular elongation
类似雨天红绿灯反射垂直拉长的效果;
给定视角后,各项同性的法线分布,造成的反射Lobe为垂直方向椭圆的Lobe;
每个像素不同的Roughness和Normal
c.3). Issues
Edge Cutoff
缓解方法:根据反射长度进行Fade off