GAMES202.闫令琪.09.实时全局光照(屏幕空间)(SSR)

  • https://www.bilibili.com/video/BV1YK4y1T7yY

屏幕空间全局光照

SSR

现实、游戏中的反射

  • 反射本质上就是全局光照

  • 不评价好坏,工厂地板的反射可能本身就没这么亮
  • 技术是不错的

发现

  • 绝大多是反射的东西都是在图上有了的东西
    • 因此可以直接使用 Screen Space 的东西
    • 白色框选部分反射的是红色框选部分

一个例子

  • 我们想做的是类似镜面反射的效果

  • 我们渲染好了整个场景,现在试图在地面上加入反射
  • 对于每一个 fragment
    • 我们对其求出反射光线
    • 我们让反射光线和场景求交
  • SSR 可以做镜面反射,也可以做 glossy 材质的反射
  • glossy 材质:采样
  • SSR 可以做地面不是平面的场景
  • SSR 可以做任意的光线追踪

SSR 思路

  • 两个问题
    • 反射光在哪里
    • 怎么做 shading

计算发射光位置

Linear Raymarch

  • 步进

  • 从 shading point 出发,沿着场景一步一步前进,利用深度图判断当前点是否和场景相交
  • 找到相交的点,就把这个点作为次级光源
  • 步长需要给定,怎么定义步长?
    • 步长太大,可能找到的点离真实的点很远
    • 步长太小,计算量太大

Hierarchical ray trace

  • 动态决定步长的大小
  • 例如下图中,反射点一开始可以直接走好几格都不会和壳(获得的图片相当于是场景的一个壳)
  • 如果我们能够很快的获得可以走多少格都不会和壳相交,这样效率就会大大提高

  • 层次结构,对对深度图做一个 mipmap,但是我们对于上一层的 mipmap,对应区域取的是下一层的最小值,而不是平均值
    • min-pooling

  • 取最小值,可以保证我们如果在上层的 mipmap 中不相交,在下层的 mipmap 中也一定不相交
    • 保守估计

  • 这样的层次结构就可以允许我们的步进值是好几个格子
  • 从层次机构的根部开始判断
    • 如果和上层的 mipmap 不相交,则直接跨过这个区域
    • 如果相交,则进入下一层的 mipmap
      • 有两个子结点,但是我们知道应该进入哪一个子结点
1
2
3
4
5
6
mip = 0;
while(level > -1) {
step through current cell;
if(above Z plane) ++level;
if(below Z plane) --level;
}
  • mipmap 存在问题,做不了起点不在 \(2^k\) 上的最小值
    • 例如上面的例子,[2, 3] 格子之间的最小值就求不了

SSR 的问题

  • 问题源自于屏幕空间
  • 我们不知到我们没有看到的场景是什么,我们只了解一层壳
  • 下图中手掌心没了

  • 下图中地面反射只有一部分窗帘
    • 我们可以根据反射光走的距离进行一个衰减,这样子的话我们可以把边缘虚化,效果会好一点

  • 虚化后的结果

Shading

  • SSR 本质上就是把 path tracing 中光线和场景求交的问题转化成了光线和场景的壳求交的问题
  • 所以之前 path tracing 的方法都可以直接使用

\[ L_o(p,\omega_o)= \int_{\Omega^+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)\cos\theta_i\,\mathrm{d}\omega_i\\ \]

  • diffuse/glossy:蒙特卡洛采样方法
  • specular:直接计算即可
  • 我们有一个假设:反射物(次级光源)是 diffuse 的
    • 和 RSM 一样,不然无法求出 \(L_i(p,\omega_i)\)
    • \(L_i(p,\omega_i)=L_o(q,q\to p)\)
  • 是否需要距离衰减?
    • 不需要
    • 还是对 BRDF 的立体角进行采样,而没有转化为光源的面积
    • 只有对光源采样才会有平方衰减的问题
  • 次级光源和 shading point 的可见性问题?
    • 处理得很好,上面的 hierarchical ray tracing 求出的是第一个交点
    • 只有对光源采样才会出现可见性问题

SSR 可以模拟的结果

  • 以下现象只要你正确对 BRDF 采样计算,就能自然得到结果
  • Sharp and blur reflections
    • 不同材质的反射结果
  • contact hardening
    • shading point 与次级光源离得越近,我们看到的反射越清晰
    • 同样的反射叶,距离越远,圆锥的面积越大,结果就会模糊一些
  • specular elongation
    • 雨天坐车看到红绿灯,地面看过去,发现红绿灯被垂直上下拉长了
    • 认为地面是各向同性的,法线分布在一个标准的圆上,给定一个观察的方向,BRDF lobe 应该是一个长条的椭圆

  • per-pixel roughness and normal
    • 我们本身没有对这些条件做出假设,因此是可以的

Improvements

  • BRDF important sampling
  • glossy 物体
    • 因为反射光线是在一个 lobe 内部,没必要对四面八方均匀采样
    • 只需要选择一个 PDF,让它和这个 lobe 形状一致

  • 复用一些可行的光路,形成新的光路

  • 预先模糊
    • Prefiltered samples
    • Weighed by each BRDF
    • 对于 lobe 多次采样,等价于预先模糊再在镜面反射的方向上采样一次
      • 问题,屏幕空间上不同的点深度是不一样的
      • 怎么做 filter 是个问题

SSR 评价

Pros

  • Fast performance for glossy and specular reflections
  • Good quality
  • No spikes and occlusion issues

Cons

  • Not as efficient in the diffuse case
    • 需要打出大量光线
  • Missing information outside the screen