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的文章。
下一节课: