0%
- https://www.bilibili.com/video/BV1YK4y1T7yY
Real-Time Ray Tracing
- 一些复杂的材质在这门课上不讲了
- Volumetric / scattering materials
- 人脸
- 《最终幻想七 重制版》 [Final Fantasy VII Remake]
- 毛发
- 《黑神话:悟空》 [Black Myth: Wukong]
- 背景知识比较多
- RTE:散射介质中光线的传播
- BSSRDF:次表面散射
- 毛发内部的一次、多次散射
- 离线渲染课程
- 更复杂的光线传播方法
- delta tracking:在散射介质中做光线的步进
- 复杂的材质
- dual scattering:毛发渲染的一种方法
- layered materials:分层的材质
- UE5 发布
RTX
- 实时光线追踪
- 早期的观点
- "Ray tracing is the futureand ever will be."
- 2018 RTX 系列硬件的推出使得实时光线追踪成为可能
- 图灵架构
- NVIDIA announced GeForce RTX series (Turing architecture)
- RTRT 的应用场景
- 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 支持降噪
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
降噪 Denosing
目标
- 目标
- 输入为 1SPP 的渲染结果
- 没有模糊、没有 artifacts、保持所有的细节
- 速度要快,降噪只是实时渲染的一小部分
- 不可能,传统的方法都不行
- 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:时间上的滤波
- 关键想法:
- 递归的思维
- 需要滤波当前帧,我们认为前一帧是已经滤波好了的
- 假设场景的运动是连续的
- motion vector:用于找到对应的 shading point
在上一帧的位置
- 结果相当于增加了 SPP(由于递归,SPP的增加是很多的)
- motion vector
G-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'\)
- 光流:找像素和像素在不同时间上的一个对应 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
- 滤波绝对不可能让一张有噪声的图变亮或者变暗,保持能量守恒
- 带噪声的图,很多噪点的能量可能是很高的,但是会被显示器给截断
- 原始的 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
- 巧妙的使用
- 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]
- 实用,能够解决一些问题,更多挖掘可用信息