【笔记】【GAMES202】Real-time Global Illumination实时全局光照

Real-time Global Illumination(in 3D)

全局光照 = 直接光照(光线弹射一次)+ 间接光照(光线弹射大于一次)

Reflective Shadow Maps(RSM)

用间接光照照亮一个点p需要知道什么?

  • 哪些surface patches are directly lit
    • shadow mapping可以提供这个信息
  • 每个surface patch对p的贡献是什么
    • 每个surface patch作为area light,把他们都加起来
image-20220512222030784

假设被直接光照亮的次级光源是diffuse的

image-20220512222601390 image-20220512225823209

(它这里分母四次方是因为点乘当中没有归一化)

忽略次级光源对shading point的可见性。

image-20220512230920138 image-20220512230929309

总结:其实就是shadow mapping的思想,把所有次级光源看作diffuse,着色的时候进行对次级光源采样

这是对于单个光源。问题是无法处理过多光源,也没有考虑间接光照部分的可见项,并且有非常多的采样。

可以看作Virtual point light(VPL)方法的光栅化版

Light Propagation Volumes(LPV)

CryEngine3引入的技术,快速、质量高

  • 核心问题

    • shading point来自不同方向的radiance
  • 思想

    • Radiance在空间中沿直线传播并且不改变
    • 使用3D网格将直接光照的表面传输到其他地方
  • 步骤

    • ==Generation== of radiance point set scene representation生成radiance点集

      • 找到直接光照表面
      • 应用RSM
      • 可能使用简化的diffuse surface patches(virtual light sources)
    • ==Injection== of point cloud of virtual light source into radiance volume

      • 预细分场景为3D网格
      • 对于每个格子,找到包含的virtual light source
      • Sum up their directional light distribution
      • Project to first 2 orders of SHs(4 in total)投影到2阶SH
    • Volumetric radiance ==propagetion==

      • 对于每个网格,收集6个表面接收到的radiance
      • Sum up,and again use SH to represent
      • 重复传播若干次至收敛
      • image-20220514211324813
    • Scene ==lighting== with final light propagation volume

      • 对于每个shading point,找到所在的grid cell
      • 取网格中的incident radiance(from all directions)
      • Shade
  • 问题

    • image-20220514211513120
    • 因为认为同一网格radiance相同 ——light leaking
    • image-20220514213435555
    • 同样假设格子间的visibility不计算

Voxel Global Illumination(VXGI)

  • two-pass algorithm

  • Two main differences with RSM

    • Directly illuminated pixels -> (hierachical) voxels
    • Sampling on RSM -> tracing reflected cones in 3D(Note the inaccuracy in sampling RSM) (Cone tracing)
image-20220514220033906 image-20220514220348504 image-20220514220600084

问题:体素化的复杂度

Real-time Global Illumination(Screen Space)

Screen space:利用从相机渲染场景得到的直接光照信息Direct illumination

相当于post processing on existing rendering

Screen Space Ambient Occlusion(SSAO)

环境光遮蔽AO,Crytek

AO就是场景中物体之间的contact shadow,易于实现,增强场景中的相对位置信息

  • SSAO

    • An approximation of GI
    • in screen space
  • Key idea 1

    • 假设不知道间接光照
    • 假设它是一个常数,对于所有shading points,来自不同方向
    • idea1相当于Ambient的思路
  • Key idea 2&3

    • 考虑different visibility(towards all directions)at different shading points
    • image-20220514222931272
    • (3D建模软件里大概叫天光)
    • 此外,假设是diffuse材质
image-20220514223032378

Theory

image-20220514223158769 image-20220514223535289

$K_a * L_i^{indir}*albedo$

在diffuse、间接光照为常数的情况下,这是准确的

image-20220514223901474 image-20220514224020238

投影立体角(Projected solid angle)

(实际上解释了$cos\theta dw_i$ 半球积分为$\pi$ )

image-20220514224235118 image-20220514224537665

但是这样是没有加权平均的

如何实时计算ka项

  • 世界空间
    • ray casting
  • 屏幕空间
    • post-rendering pass
    • 不用预计算
    • 不依赖场景复杂度
image-20220514224953129

只考虑一定范围内有没有遮挡物

  • SSAO
  • 假设任何一个shading point 在周围体积采样点,判断点被shading point看到的结果
  • 使用相机的depth buffer来判断
  • image-20220514225151550
  • 按理说只需要考虑法线方向的半球就可以了,但法线信息可能是不知道的
  • 因此做法是,只有过半的点在内部(红点),才开始使用AO,使用球而不是半球,但是只有过半的点才开始计算
  • image-20220514225603651
  • 也没有cos项的权重,但这一点可以忽略了
  • image-20220514230015563

其他问题:False occlusions

image-20220514230147163
  • Choosing samples

    • 采样越多越精确,但考虑速度只用16个
    • 少量sample得到结果,再降噪
  • Horizon based ambient occlusion(HBAO)

    • 也是在屏幕空间
    • 近似ray tracing 深度缓冲
    • 需要知道法线(normal map),只采样半球
    • (有法线可以对不同方向进行加权计算)

Screen Space Directional Occlusion(SSDO)

  • SSDO
    • SSAO的提高
    • 考虑更多的实际间接光照
  • 思路
    • 不必假设接受的间接光照是uniform的
    • 一部分间接光照信息是已知的(间接光照=次级光源提供的直接光照(RSM))
  • SSDO使用的直接光照信息不来自于RSM,来自于摄像机
  • 类似于path tracing
    • 在shading point发射随机的光线
    • 如果没有遇到障碍物,是直接光照
    • 如果遇到障碍,是间接光照
  • 比较
    • AO假设间接光照来源非常远,DO假设间接光照来源周围
    • image-20220515131429453
image-20220515131937025

类似HBAO,考虑点p的局部半球

image-20220515132410638

采样到的点不被挡住,则没有间接光照,被挡住,则有间接光照,并且把它们加起来。

如图3,会出这样的问题,P-A没有被挡住,但在屏幕空间的深度判断下,将它认为是挡住的,P-B则相反。

  • SSDO质量更接近离线渲染
  • 仍然只是小范围的GI
  • 可见性偏差
  • 屏幕空间的问题,丢失了不可见表面的信息(一切SS都会出现这种问题)
image-20220515132917610

Screen Space Reflection(SSR)

  • SSR
    • RTR中实施GI的方式
    • 在屏幕空间进行光线追踪
    • 不需要3D信息
  • 基本任务
    • 求交
      • 光线和场景
    • 着色
      • 从交点像素到着色点

反射本身就是全局光照

假设场景没有反射,要加入反射,反射出来的东西都是屏幕上已有的东西。

  • 对于每个像素(镜面反射)
    • 计算反射光线
    • 和屏幕上的物体求交
    • 使用交点颜色做反射色
  • 对于一定roughness的材质,根据BRDF考虑采样的反射光线数量
  • 甚至可以加上法线信息
image-20220515133949777

对于地面任何一个点,可以描述它的反射光,如何求交?

  • Linear Raymarch
    • 每一步检测深度值
    • 质量取决于step size
image-20220515134334564
  • Hierarchy ray trace
    • Generate Depth Mip map
      • 下采样使用最小深度而不是平均
      • 类似于3D空间的层次结构(BVH,KD-tree)
      • 能快速舍弃不可能相交的像素
      • 最小值建立一个保守的判断逻辑
image-20220515134751855 image-20220515134931819

先保守一点只走一步,没有交点,就可以多走一些,如果终于遇到了最小深度交点,就有可能和场景相交了,就需要少走一些。

image-20220515135234170 image-20220515135328284 image-20220515135417034

image-20220515135432576

image-20220515135443096

最小层级都有交点,或者离开了屏幕,就可以停止了。

局限:Mipmap上判断不了起点不在2^k上像素的深度最小值

  • 问题:,因为只在屏幕空间中计算
    • Hidden Geometry Problem
    • image-20220515140428156
    • Edge Cutoff
    • image-20220515140620129

Shading using SSR

和path tracing没有差别,只需要假设diffuse reflectors/secondary lights

  • 是否引入平方衰减?
    • 不需要,只要是算radiance,就不用,只有irradiance才会有伴随面积变大,能量衰减的效果。
  • 是否考虑了着色点和次级光源之间的可见性?
    • 是的,因为ray trace
image-20220515140938022

可以解决

  • Sharp、bulrry reflections

  • Contact hardening(specular的lobe在非常近的距离,也只会采样很少的范围)

  • Specular elongation(被拉长,还是brdf的lobe采样的原因)

  • Per-pixel roughness and normal