GAMES202.闫令琪.12.实时光线追踪

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

Real-Time Ray Tracing

  • 一些复杂的材质在这门课上不讲了
  • Volumetric / scattering materials
    • 人脸
      • 《最终幻想七 重制版》 [Final Fantasy VII Remake]
    • 毛发
      • 《黑神话:悟空》 [Black Myth: Wukong]
  • 背景知识比较多
    • RTE:散射介质中光线的传播
    • BSSRDF:次表面散射
      • 出射点和入射点可以不同的 BRDF
    • 毛发内部的一次、多次散射
  • 离线渲染课程
    • 更复杂的光线传播方法
      • delta tracking:在散射介质中做光线的步进
    • 复杂的材质
      • dual scattering:毛发渲染的一种方法
      • layered materials:分层的材质
  • UE5 发布
    • 一些技术的可能实现
    • Nanite
    • Lumen

RTX

  • 实时光线追踪
  • 早期的观点
    • "Ray tracing is the futureand ever will be."
  • 2018 RTX 系列硬件的推出使得实时光线追踪成为可能
    • 图灵架构
    • NVIDIA announced GeForce RTX series (Turing architecture)
  • RTRT 的应用场景
    • 设计:汽车渲染
    • 影视动画
    • ...

image-20210531212121853

  • RTX 做了什么
    • 做了很多 demo 展示效果:Impressive demos of RTRT
      • 主要是高亮的场景(glossy)
        • 一方面 glossy 材质方便求反射光线
        • 另一方面 diffuse 材质你看不出来与传统方法的区别
    • Advanced ray traced effects:能够实现很多之前比较难做的效果
      • Shadows
      • Reflections & Specular
      • Ambient Occlusion
      • Global Illumination
    • RTX 是一种架构,允许我们 trace 光线
    • RTX 是一种硬件上的突破,计算的很快
      • tensor core:加速神经网络
      • rt core:针对 ray tracing 做的优化
      • 10 Giga rays per second
        • 帧数、其他计算的考虑,最终的效果留给 RTRT 的时间能够达到 1spp
          • 1 sample per pixel (2080Ti)
    • RTX 支持降噪
      • 1SPP 噪声严重

SPP

  • 1 SPP path tracing:为了实现全局光照效果,至少 4 条光线
    • 1 rasterization (primary) +
    • 1 ray (primary visibility) +
    • 1 ray (secondary bounce) +
    • 1 ray (secondary visibility)
  • primary hitpoint:第一次打中的点
  • shadow ray:判断这个点对光源是否可见
  • one bounce
    • secondary hitpoint
    • shadow ray

  • 一种优化
    • 没必要对所有的像素进行一次 ray tracing
    • 先进行光栅化,可以更快
  • 这样 1SPP 需要考虑的光线少了 1 条(找到 primary hitpoint 的光线光栅化做了)
  • 1 SPP 效果很差,噪声很严重

RTX 的 denoising

  • State of the Art* Denoising Solution

  • 1SPP 变成这样的效果
    • 震惊但是这是真的

降噪 Denosing

目标

  • 目标
    • 输入为 1SPP 的渲染结果
    • 没有模糊、没有 artifacts、保持所有的细节
      • overblur(高斯滤波的结果)
    • 速度要快,降噪只是实时渲染的一小部分
      • 每一帧降噪所花费的是时间小于 2ms
  • 不可能,传统的方法都不行
    • Sheared filtering series (SF, AAF, FSF, MAAF, …)
    • Other offline filtering methods (IPP, BM3D, APR, …)
    • Deep learning series (CNN, Autoencoder, …)
      • 现在来看,速度太慢了
      • 跑一个神经网络花费时间在 100 ms 左右
  • Optix:Nvidia 的光追 API

工业界的解法

  • Temporal:时间上的滤波
  • 关键想法:
    • 递归的思维
    • 需要滤波当前帧,我们认为前一帧是已经滤波好了的
    • 假设场景的运动是连续的
      • 利用上一帧的 shading 结果
    • motion vector:用于找到对应的 shading point 在上一帧的位置
    • 结果相当于增加了 SPP(由于递归,SPP的增加是很多的)
  • motion vector

  • 空间上的降噪
    • 下一节课

G-Buffer

  • Geometry Buffer
    • 光栅化得到的

  • 需要什么,保存什么
    • 可以保存深度、法向、世界坐标系位置等各种信息
    • 保存的是屏幕空间的信息
  • 生成 G-Buffer 通常认为是轻量级的
  • 使用 G-Buffer 是很快的

Back Projection

  • 找对应点
  • 当前帧 \(i\) 中的像素点 \(x\),找到这个像素中的内容在上一帧 \(i-1\) 中的位置 \(x'\)
    • \(x,x'\) 在世界坐标系中具有相同的世界坐标系坐标

  • 求出世界坐标系位置 \(s\)
    • 如果有 G-Buffer 中,直接取出 \(s\) 即可
    • 如果没有 G-Buffer,计算得到 \(s = M^{-1}V^{-1}P^{-1}E^{-1}x\)
      • \(E\) 视口变换,带 \('\) 表示上一帧结果
      • 需要用到深度信息,屏幕空间是 2D 的,变换是 3D 的
  • 计算上一帧世界坐标系坐标 \(s'\) 的位置(已经得到了世界坐标 \(s\)
    • 我们是知道物体怎么运动的,计算即可,我们拥有整个场景的运动信息
    • \(s'{\buildrel{T}\over\longrightarrow} s,s{\buildrel{T^{-1}}\over\longrightarrow} s'\)
  • 计算在上一帧中的位置 \(x'\)
    • \(x'=E'P'V'M's'\)
  • 光流:找像素和像素在不同时间上的一个对应 optical flow
    • 算 motion vector 本质上也是一种 optical flow
    • motion vector 是完全物理正确的
    • 光流是根据内容推理,但是深度学习能够做的很好

blending

  • 怎么结合得到的两张图
  • 符号定义(象形hhh)
    • \(\sim\) :unfiltered
    • \(-\):filtered
  • 步骤
    • 当前帧自己先做一次降噪(空间)
      • \(\bar{C}^{(i)}=Filter[\tilde{C}^{(i)}]\)
      • 1SPP 情况下只依赖当前帧的结果,降噪效果是不可能很好的
    • Temporal(时间)
      • \(\bar{C}^{(i)}=\alpha\bar{C}^{(i)}+(1-\alpha)\bar{C}^{i-1}\)
      • 对应像素而不是同一个像素
      • 通常 \(\alpha\in[0.1,0.2]\)
      • 说明用的内容主要是上一帧的内容,大胆的设想

效果

  • 1spp Ray Traced Global Illumination

  • 1spp Ray Traced Global Illumination + Denoising

  • Ground Truth

  • 滤波绝对不可能让一张有噪声的图变亮或者变暗,保持能量守恒
    • 带噪声的图,很多噪点的能量可能是很高的,但是会被显示器给截断
    • 原始的 exr 图片,在 HDR 显示器上显示的结果,denoising 前后亮度应该相差不大
  • 一些问题
    • 缺失了一些信息,例如左上角圆台体中间条带的 contact shadow
    • 一些细节由于降噪变得模糊
  • 1SPP 的效果!!!!!!

问题

  • 场景的第一帧怎么渲染?切换了场景?突变的光源(蹦迪)?
    • burn-in period:场景突变需要一段时间累计信息
    • 这是上面的方法是做不到的
  • 向后走场景做不了
    • walking backwards in a hallway
    • 很多点上一帧还不在渲染结果内
    • 屏幕空间的问题
  • disocclusion:在新的一帧中从遮挡状态转变为不被遮挡的状态
    • 这一帧的点在上一帧中被遮挡
    • 于是在上一帧中找到的对应点并不是真正的对应点,而是挡住对应点的点
    • 屏幕空间的问题
  • detached/lagging shadows
    • 阴影的拖尾问题(shading 的问题)
    • 如下场景,场景、像机都不移动,于是任何一个像素 motion vector 为 0
    • 此时移动光源,造成阴影拖尾的现象

  • glossy 反射的问题
    • 反射的拖尾(shading 的问题)
    • 如下场景中,相机、地板、光源保持不动,于是地板的 motin vector 为 0
    • 移动椅子,我们发现,地板上的反射效果得过一会才能跟上物体的运动
    • 快速移动有延迟,滞后问题

问题解决

问题 3

  • 不能用,但是强行使用
    • Lagging:拖尾效果,鬼影

  • 巧妙的使用
  • Clamping
    • 把上一帧的值先拉近到这一帧的结果
  • Detection
    • 如果检测到不对应,则不使用上一帧的信息
    • 例如给物体标 ID,如果上一帧的 ID 不一致,则调整 \(\alpha\) 的值(使用更少的上一帧信息)
  • 这样的问题:引入了噪声(降噪效果变差)

TAA

  • The temporal accumulation is inspired by Temporal Anti-Aliasing (TAA)
  • 类似的想法
  • 论文
    • Temporally Reliable Motion Vectors for Real-time Ray Tracing
    • [Eurographics]
    • 实用,能够解决一些问题,更多挖掘可用信息