Games202-4 Real-time Global Illumination(Screen Space)

a). Screen Space Ambient Occlusion(SSAO)

a.1). Introduction

  • SSAO:屏幕空间中,对全局光照的近似;
  • Key idea:

    1. 假设各方向间接光照的强度相同(类似于Phong模型中的Ambition light)

    2. 考虑不同着色点,有不同的Visibility

      SSAO_Intro01

    3. 假设材质为diffuse

    4. 假设间接光照来自于比较远的地方。因此,橙色的光线,即一定范围内不被遮挡的光线会贡献间接光。(如假设间接光来自比较近的地方,则是红色射线方向贡献间接光)

      SSAO_Intro02

a.2). Theory

SSAO_Theory01

  • 通过不等式,拆分渲染方程为:

    SSAO_Theory02

    • $k_A$ 项代表不同方向Visibility的(加权)平均
    • 黄色框可用一个Constant color表示

      • 假设了间接光 $L_i^{indir}$ 各方向强度相同,因此为常数;
      • 假设了材质为Diffuse,因此BRDF为常数;
      • $cos\theta$ 半球积分为$\pi$
    • 同样,因为黄色框,即$g(x)$为常数,其Support极小。因此,应用该不等式是精确

  • A deeper understanding 1:
    • SSAO_Theory03
  • A deeper understanding 2:(为什么Visibility项会有$cos\theta$)

    SSAO_Theory04

    • 加上 $cos\theta$ 的含义是把积分域从单位半球投影到单位圆上(Projected solid angle);

      SSAO_Theory05

    • 为什么要这么做呢?

a.2.1). Simpler understanding

SSAO_Theory06

  • 那么,我们怎么算 $k_A$ 项(不同方向Visibility的(加权)平均)呢?这就是AO算法实现的,如SSAO;

SSAO_Theory07

  • 在计算AO时,我们计算的Visibility是限制在一定半径内的一个半球的局部遮挡。如在封闭的区域,如室内,如不限制半径,那Visibility将会为0。因此需要限制半径。

a.3). 实现

  • 屏幕空间环境光遮蔽,全称Screen Space Ambient Occlusion,一种用于计算机图形中实时实现近似环境光遮蔽效果的渲染技术。通过获取像素的深度缓冲法线缓冲以及像素坐标来计算实现,来近似的表现物体在间接光下产生的阴影。

  • 做法总览(详情见百人计划图形4.2 SSAO):

    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;

    SSAO_How01

  • Cons:

    1. 由于是通过屏幕空间像素坐标和Z-Buffer取近似场景,只模拟了离屏幕最近的表面,对于一些点(如箭头所指的红点)的Visibility会误判;(从着色点看向该点可以看到,但SSAO中却将该点视为被遮蔽)

    2. 没有$cos\theta $ 项的加权,因此在物理上是不准确的;

      SSAO_How02

 [^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)
  1. 由于SSAO中未考虑深度比较时采样点深度和Z-Buffer深度的差值,造成相距比较远的物体之间也会存在AO (HBAO解决了)

    SSAO_How03


b). Screen Space Directional Occlusion(SSDO)

b.1). Introduction

  • An imporovement over SSAO;
  • 考虑了更准确的间接光照(不再假设各方向的间接光照相同)
  • Key idea:
    • 考虑了更准确的间接光照
    • 使用已知的间接光源信息
      • 如RSM得到的Secondary Light Source 的flux等;
  • 效果: 间接光照更为准确,出现了color blooding

    SSDO_ColorBlooding

  • 做法:(与Path Tracing非常相似)

    • 着色 $p$点 时,发射随机光线;
      • 如未被遮挡(无交点): 该点受直接光照影响(如Ambient Light);
      • 如被遮挡(有交点): 该点受间接光照影响;

    SSDO_How00

b.2). 实现

  • 与SSAO相比: SSAO为被遮挡的光线的方向为间接光照贡献方向,SSDO则是被遮挡的光线方向为间接光照贡献方向;

    (SSAO)假设间接光照来自于比较远的地方。因此,橙色(被红圈圈起来的)的光线,即一定范围内不被遮挡的光线会贡献间接光。(如假设间接光来自比较近的地方(SSDO),则是红色射线(被橙圈圈起来的)方向贡献间接光)

    SSDO_vsSSAO

    SSDO_Func

    • 间接光照的计算则可采用RSM、或者LPV、VXGI等;
  • 具体做法:

    SSDO_How01

    • 和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

  1. 只能计算小范围的AO;

    SSDO_issues2

  2. 是通过采样点深度和Z-buffer比较得出Visibility,而不是从P点出射光线计算交点,导致Visibility不精准;

  3. 屏幕空间的通病: 失去了屏幕中未被显示(如屏幕外)的表面的信息;

    • 屏幕空间只能表现场景最表面(Depth最小)的一层“壳”;

    SSDO_issues

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的贡献;

SSR_Intro01

  • 效果: 可实现Specular reflection和Gloosy reflection;

    • 对于Specular只用追踪镜面反射方向即可;
    • 对于Gloosy知道BRDF后需追踪入射方向的Lobe;

    SSR_Intro02

c.2). 实现

SSR_How01

Two fundamental tasks of SSR:

  • 求交:任何光线和场景;
  • 着色:交点对Shading point的贡献;

c.2.1). Intersection(求交)

SSR_How_Intersection01

  • 使用光线步进(Raymarch),那么如何确定步进的步长?

    • Hierarchical tracing

      SSR_How_Intersection02

      • 不想一层一层步进,而是允许时步长变大;

Hierarchical tracing

  • Step1: Generate Depth Mip-Map(使用最小池化,而不是平均)

    SSR_How_Intersection03

    • 取最小: 如2x2的像素中,取最小深度值作为下一层该位置的深度;

    • 最小池化构造出类似与KD-tree的结构;

    • 逻辑: 取最小后,如果光线不和父(更大的)节点相交,那就不会和子节点相交;

      SSR_How_Intersection04

  • P-Code

    SSR_How02

    • 开始在Mip0层步进
      • 没交点则进入下一层Mip(父节点);
      • 有交点则进入上一层Mip(子节点),并在交点对应位置的子节点继续求交;
      • 直到找到Mip0层的交点,结束循环;(演示看PPT)

c.2.2). Shading

SSR_Shading01

Shading过程和Path tracing相似;

  • 假设: Reflectors(反射物)/ Secondary light source是Diffuse的
    • 原因: 生成Shaded场景时,只知道屏幕空间下一个点的Radiance(即Shading Point到Camera的Radiance)。如假设Reflector为Diffuse,那么该点的$L_i$就为framebuffer中的颜色;

c.2.3). 效果

SSR_Show01

  • 可实现锐利或模糊的反射;

  • Contact hardening(接触的地方反射较为锐利,类似PCSS)

  • Specular elongation

    • 类似雨天红绿灯反射垂直拉长的效果;

    • 给定视角后,各项同性的法线分布,造成的反射Lobe为垂直方向椭圆的Lobe;

      MicrofacetBRDF

  • 每个像素不同的Roughness和Normal

c.3). Issues

  • Edge Cutoff

    SSR_issue01

    • 缓解方法:根据反射长度进行Fade off

      SSR_issue02

d). Pros And Cons

SSR_ProsAndCons