Games202高质量实时渲染_lecture12_Real-Time Ray Tracing 1

在这里插入图片描述
皮肤,毛发的渲染都非常复杂,放在离线渲染中讲。
在这里插入图片描述

在这里插入图片描述

1 Basic idea

1 RTX

在这里插入图片描述
2018年 ,提出了RTX架构。2500亿市场。
在这里插入图片描述

RTX做什么?
允许我们做光线追踪。

在这里插入图片描述

在这里插入图片描述

软阴影,反射,环境光遮挡,全局光照。
RTX就是一个硬件架构,能够让我们去trace光线 而已。

RTX是硬件上的一个突破,就是在显卡上加了一个部件。这个部件就是来做光线跟踪的

光线追踪本质上做的就是做光线和场景的求交。
光线和场景如何求交?不断判断光线和一个BVH和AD Tree这种加速结构,从上到下,根节点到叶节点走一遍,看光线和哪些节点内部的三角形相交。其实本质上在做的就是数值遍历的问题。
GPU不好做这个事情。

新的部件可以让每秒trace更多的光线。硬件能力上针对ray tracing,得到了质的飞跃。
每秒trace 100亿根光线。(10G)

2 SPP path tracing

1个光路样本
在这里插入图片描述

在这里插入图片描述
1个像素需要打四条光线。

1 rasterization :每个像素都要从camera出发打一条光线穿过像素,看它打到了什么?这一步和光栅化一模一样。与其说 每一个像素trace一根primary光线,不如真正的光栅化一遍,也可以得到最前面的位置。光栅化更快点。
这样的话就只考虑三条光线就可以了。

通过硬件,可以做1spp了,但是结果还是很noisy。RTRT最关键的地方就是降噪。
实时光线追踪和之前的path tracing 只是进行了算法简化,并没有什么新的算法,本身的突破是因为硬件能力的增加。

在这里插入图片描述

RTRT降噪的效果:
在这里插入图片描述
输入是左手和右下,中间是降噪的效果。
与DLSS没有关系。

2 Motion vector

1 previous method

overblur:过于模糊
artifact:肉眼可见的bug
速度:小于2ms。

没有RTX的时候,接近于实时,

离线的方法,一幅图需要1分钟。

深度学习的发方法,不可以,跑一遍网络就需要几十ms。
optix—自带降噪器。几十ms
在这里插入图片描述

2 industrial solution

工业界是如何做的呢?

Temporal:时域上的滤波方法。
关键思维:当前帧的前一帧是滤波好了的。
帧和帧之间具有连续性。
用motion vector来找到前一个位置,告诉你物体是怎么样运动的,从而可以找到之前的对应。
用上一帧的信息知道当前帧,通过这种方法相当于增加了spp。上一帧也用了上一帧的结果,所以是指数衰减。
时间上的复用。
在空间上如何使用呢?下一节课讲。
在这里插入图片描述

3 G-buffer

几何缓冲区

直接光照,得到一张深度图,任意一个点的法线图,任意一个点对应的albedo图,也就是以前的kd值,世界坐标。

生成G-buffer是很轻量的。
G-buffer记录的是屏幕空间的信息。
在这里插入图片描述

4 back projection方法

通过back projection方法准确的求出了motion vector;。
当前帧和上一帧,像素和像素的对应。这个对应到底是谁,
肯定不是像素的坐标, 是要找这个像素里面的内容在上一帧应该在哪个位置。
你透过这个像素看到的这个点,在这个场景或者物体上,它的世界坐标在上一帧,如果还投影到你的上一帧的屏幕上,然后你在上一帧屏幕上会看到什么。

在这里插入图片描述

首先要得到当前帧的像素x,透过它看到的那个点的世界坐标到底是什么,也就是知道这个点它真实坐标是什么,而不是它当前的屏幕上的坐标。

在G-buffe中我们生成了一个世界坐标的图,这个图记录的就是每个像素对应的世界坐标。
1.如果有拿到就可以了,如果没有可以算。
2.如果没有需要自己算,过程如下:
games101复习
三维空间中的一个点,最后怎么能够变到屏幕上?
经过MVP变换,然后modelviewprocjection矩阵变换,变成一个[-1,1]三次方的cube,然后再经过一个视口变换viewport,变到屏幕上。

把上面这个过程逆变换,但是那个像素点的坐标,必须要带着深度z,变成一个三维的。

如果当前帧和上一帧这个物体没有动,它的世界坐标不会变。
如果点运动了,需要存下一个变换,知道了当前帧像素点的世界坐标,用变换矩阵,求逆就可以得到上一帧的世界坐标。这样当前帧和上一帧的世界坐标我们都知道了。
通过MVP,视口变换我们就得到了当前帧的点在上一帧的对应。
在这里插入图片描述
光流和motion vector的区别:
motion vector:是个准确的算法,我可以百分之百计算到像素点对应到上一帧的哪里。
但是光流是基于内容的,用的是两帧渲染的结果,然后去找他们的对应。这个就挺困难。如果用深度学习的方法去求光流就很慢。最主要的区别就是我们的算法掌握着整个渲染的过程。

3 Temporal accumulation/filtering

在这里插入图片描述

当前帧80%左右都是用的上一阵的信息。
如果当前帧的光照改变了,是否可以用上一帧的信息:不能;
g-buffer是通过光栅化的时候得到 的

没有RTX的时候做的整个效果。1spp,8-9FPS;

在这里插入图片描述

在这里插入图片描述
降噪后的结果:
在这里插入图片描述
降噪后的结果亮了,但是带噪声的图绝对不应该是暗的(能量守恒)。
在HDR显示器上看的话带噪声的也是亮的。
滤波绝对不会让带噪声的图变亮。
下面的图是正常的光锥实现的效果,对比降噪和下面这张图,可以看到缺失了一些信息。
在这里插入图片描述
在这里插入图片描述

4 Temporal Failure

时间上不好用的时候,该怎么办。

依赖于上一帧,如果没有第一帧,那怎么办。

1 failure case

1 case 1: swithcing Scenes;

蹦迪的场景,光源一直在变换。
在这里插入图片描述
burn-in period;预热
突变后需要一段时间去预热。

2 case2 :waking backwards in a hallway-screen space issue.

上一帧的时候一些物体不在屏幕中,像素点找不到上一帧的对应。
在这里插入图片描述

3 case3 suddenly appearing background(disocclusion)

motion vector
disocclusion区域的问题,本质上还是屏幕空间的问题。
在这里插入图片描述
如果强行复用的话,就会把上一帧的颜色补到不该补的地方。
在这里插入图片描述
严重的拖影。
在这里插入图片描述

4 case 4

以上都是几何方面的问题,还有shading方面的问题。

1 detached shadows问题。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2 glossy reflected images

地板上的反射颜色滞后。
在这里插入图片描述

问题是什么?
因为几何没有变,所以motion vector就会没动,但是它的shader变的非常厉害。

2 如何解决

在这里插入图片描述

Clamping:
上一帧没有噪声的值拉进当前帧。

Detection:
多做一步判断,
每个物体都有一个颜色,作为它的编号ObjectID。
0号物体,箱子是6号物体,
如果这一帧是0号物体,找到上一帧的对应也是0号物体,那可以接受;
如果找到上一帧的对应是6号物体,不可以接受。然后调整apha。但是会更noise,重新引入了noise.
在这里插入图片描述

5 some side notes

和TAA很类似。

第一篇研究motion vector的文章。
在这里插入图片描述
下一节课:
在这里插入图片描述
在这里插入图片描述

6 视频

https://www.bilibili.com/video/BV1YK4y1T7yY?p=12

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值