不得不提一句,在开始这个模块之前,我还很兴奋,因为我刚买了一块RTX2060,我想着是不是可以得到纯Ray Trace的操作。但是这个模块上下来,基本逻辑如下:
1.基于硬件的光线追踪1SPP级;
2.Denoising降噪技术。
RTX:
基于图灵架构的RTX显卡号称是开启一个时代,本市张世硬件的提升,增加了支持光线追踪的核心,实际上没有任何的算法部分。通常来说光线追踪就是光线与场景物体的求交(学习这个部分我推荐大家实际操作一下RayTraceinOneWeek),为了加速求交往往使用BVH或者KD-Tree这个加速结构,我们如果要使用光线追踪实现全局光照,必须让光线至少在场景中bounce一次,如图:
从我们的眼睛出发,发出一条光线hit位置1,从1要产生一条shadow ray判断当前点是否处于阴影中,以及进行一次随机的bounce(diffuse的材质),然后打中2位置;从2位置连接光源的shadow ray判断是否处于阴影,这样就构成了至少场景一次bounce,实际上是可以有多个bounce的。
其中第一条从眼睛到场景位置1这条光线可以取消,用光栅化来代替(不带阴影),这样很快速,然后后边的shadow ray与bounce才使用光线追踪。这样做的结果:很多的噪声。
这也很好理解,因为采样数量少,那么要实现RTRT,当前硬件条件下,核心技术就是降噪Denoising。
Denoising:
降噪的目标:no overblur, no artifacts, keep details, speed<2ms
根据课程的整个框架,大致把降噪分为时间(Temporal)和空间(Spation)。
时间维度:reuse
简单的来说就是利用前一帧结果对当前帧进行贡献,基本思路如下:
1.确定当前帧渲染的像素对应的3D场景shading point;
我们在渲染的时候可以快速得到G-Buffer这种存储数据,这些数据与像素位置一一对应,可以是normal,wPos,depth等等。那么我们快速得到当前帧某像素对应的wPos;
2.使用相邻两帧之间转换矩阵求解一个用于回溯上一帧相同shading point的motion vector;
毫无疑问,我们希望找到上一帧有相同wPos的对应像素,对此:;所以:这就找到了上一帧对应的坐标;
3.取上一帧对应着色信息对当前帧进行贡献;
然后基于上一帧的MVP矩阵将其转