Lecture 7-8 Real-time Global Illumination (3D GI)

Introduction

  • GI is complex

    • Ray tracing …
    • Hack方法:Blinn-Phong——统一大小的Ambient项
  • in RTR:直接光照 + 一次间接光照

  • 一次间接光照:Q点接收到直接光照后,作为次级光源照射P点的结果 GIIntro1

核心问题:

要计算间接光照需要知道

  • 被直接光照照亮的表面有哪些? / 哪些是次级光源?
    • 借助Shadow Map
  • 每一个次级光源的“贡献”是多少?
    • 求和
    • 每一个次级光源作为一个Area Light

Reflective Shadow Maps (RSM)

  • 获得光源的Shadow Map,存储光源“可见”的深度/世界坐标/法线/Flux等(即Reflective Shadow Maps),视作多个多个点次级光源,eg. Reflective Shadow Maps为512*512,则有512*512个点光源。
  • 次级光源的反射方向未知——假定次级光源物体材质均为Diffuse。(不假设接收物为Diffuse)

Recall LightMeasurementofInterest

  • 一个Patch(Reflective Shadow Maps的一个像素)的“贡献

    RSM1 \[ \begin{array}{l}\begin{aligned}L_o(\mathrm p,\omega_0)&=\int_{\Omega_\mathrm{patch}}L_i(\mathrm p,\omega_i)V(\mathrm p,\omega_i)f_r(\mathrm p,\omega_i,\omega_0)\cos\theta_i\,\mathrm d \omega_i\\ &=\int_{A_\mathrm{patch}}L_i(\mathrm q\rightarrow \mathrm p)V(\mathrm p,\omega_i)f_r(\mathrm p,\mathrm q\rightarrow \mathrm p,\omega_0)\dfrac{\cos\theta_p\cos\theta_q}{\|q-p\|^2}\,\mathrm d A \end{aligned}\\\\ f_r=\dfrac{\rho}{\pi}\\ L_i=f_r\cdot\dfrac{\Phi}{\mathrm d A}\quad(\Phi\ \text{is the incident flux / energy}) \end{array} \] 故对每个Reflective Shadow Maps的像素只需存储其 \(\Phi\)\(\mathrm d A\) 在积分中被约掉; 由于计算复杂、忽略次级光源的Visibility项。 则有:(原论文中为 \(P\rightarrow Q\) ,故论文中原式为下式中 \(q\) 换成 \(p\)\[ E_q(x,n)=\Phi_q\dfrac{\max\{0,\langle n_q|x-x_q\rangle \}\max\{0,\langle n|x_q-x\rangle \}}{\|x-x_q\|^4} \]

  • Reflective Shadow Maps中不是每一个像素都可以作为次级光源有“贡献”:

    • Visibility 遮挡,但该项计算复杂,影响不大,故忽略
    • Orientation 方向,例如下图 \(x_{-1}\)\(x\) 无光照 RSM1
    • Distance 距离 -> 减少计算量的方法 ↓
  • 假设:以Reflective Shadow Maps上的距离近似世界坐标的距离 RSM3

    • 参考PCSS,降低Shadow Map作为次级光源的采样
    • 对一个Shadow Map,约400个采样
  • 优势:易于实现 问题:性能开销与直接光源数量成正比 / 间接光照不考虑可见性(不真实) / 大量假设 / 采样率和质量的权衡

  • 非常类似离线渲染中的VPL(Virtual Point Light)方法

Light Propagation Volumes (LPV)

关键问题:着色点收到所有方向的间接光照 关键想法:Radiance沿直线传播,且在空间中传播时不会变化 解决思路:用体素传播Radiance

步骤

  • 获取次级光源

    • 利用RSM,采样以减少数量
  • 将次级光源的Radiance“注入”到空间网格/体素中

    • 预分割三维网格(eg. 3D texture)
    • 对每个网格,找到接近的次级光源
    • 求次级光源接收的直接光照Radiance分布和(空间分布)
    • 用二阶SH函数(4个数值)压缩Radiance空间分布(近似) LPV1
  • 在网格中传播Radiance

    • 空间上向周围6个面传播,周边网格也用二阶SH表示 LPV2
    • 迭代4-5次基本达到稳定
  • 在着色点处读取对应体素的Radiance参与渲染

问题

  • 由于粒度不够小(至少比画面分辨率小一个数量级),会传播到物体背面/侧面 -> Light Leaking LPV3
  • 同样不考虑Visibility

Cascaded / Multiscale / LoD: 用自适应粒度的网格

Voxel Global Illumination (VXGI)

  • 2 Pass Algorithm Differences with RSM:

    • 直接光照对象 / 次级光源 pixel -> (hierarchical) voxels (层级结构的体素,大小层级,建立树结构存储)
    • RSM中的采样 -> 对每个Shading Point作圆锥形trace,计算trace到的voxels
  • Voxelize the scene & Build a hierachy

    VXGI1VXGI2

  • Pass 1 : Light Pass

    • 存储光源的入射分布、法线分布,再在trace时计算出射分布(比LPV中视作Diffuse使用SH压缩存储准确,可以支持Glossy材质) VXGI3
    • 在hiearchy中更新
  • Pass 2 : Camera Pass

    • 对Glossy材质,向反射方向作cone trace

    • 基于cone的大小遍历hierarchy,找到相近大小的块再求和 VXGI4VXGI5

    • PS:对Diffuse材质,求能覆盖表面的多个cone trace(eg.8个,空隙可忽略) VXGI6

  • 问题:计算量较大、实时体素化开销较大