jimmy肖明 发表于 2021-1-4 11:20

光线追踪与实时渲染的未来

今年GDC最大的新闻也许就是各大公司猛地一下子宣布了对光线追踪的支持。NVIDIA发布了RTX技术以及在GameWorks里加入了光线追踪去噪(Denoising)模块,微软正式将光线追踪加入DirectX12,取名DirectX Raytracing (DXR) ,各大游戏公司例如Epic, EA, Remedy也都纷纷展示了各种酷炫的实时光线追踪Demo。
我们在今年的GDC上也给了一个Talk,介绍我们这些年在实时光线追踪方向的研发结果,对技术细节感兴趣的同学也可以听听这个Talk:
然后,开始正文前,先帮大家把所有这星期新鲜出炉的Demo链接汇总一下:
首先是画质炸裂的Star Wars微电影,通过光线追踪展示了实时电影级别的光照,由NVIDIA,Epic和ILMxLab合作的成果:
Reflections Real-Time Ray Tracing Demo
其次是NVIDIA的RTX Demo,充分展现了所有实时光线追踪能做到的事情:从提升实时渲染中环境遮挡(AO),面积光软阴影,粗糙表面的反射,到能极大提升引擎内容创作的引擎内置的路径追踪(Path Tracing)离线渲染到可交互的光照图与计算(Light Map Baking):NVIDIA RTX and GameWorks Ray Tracing Technology Demonstration
个人感觉以上两个Demo大约是过去几年来最有诚意最干货的Demo了,短短几分钟包括了太多技术创新的内容,背后凝结的更是几年的研发和工程实践。(当然我的观点肯定会有Bias,毕竟两个Demo里都用了不少我研发的技术,并且我都参与了制作 :P)
除了上面两个以外,还有EA Seed的PICA PICA Demo:SEED - Project PICA PICA - Real-time Raytracing Experiment using DXR
Remedy的Ray Tracing in North Light Demo:Experiments with DirectX Raytracing in Northlight
和最后Futuremark的Demo:DirectX Raytracing tech demo - accurate real-time reflections
上不了Youtube的朋友可以看这个Bilibili的视频合集,里面有所有上面提到的高清视频:【画质炸裂1080p】欢迎来到次世代!微软DXR&英伟达RTX实时光线追踪视频合集_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili


可编程着色以来实时图形API最大的改变

光线追踪被加入DirectX这样主流的API无疑是图形API历史上少有的大飞跃,对于未来游戏的画质,以及内容创作的过程都会有很深远的影响。对于完全没听过光线追踪的读者可以看看我很久以前的一个相关回答:
文刀秋二:如何根据数学或者物理程式写一个特效软件?例如星际穿越中的黑洞。
这次在API层面对DX12的改进,主要是加入了一个全新的管线专门执行光线追踪的任务。以后让GPU发起任务的方式除了现有的光栅化渲染,和通用计算以外,新加入了一个追踪光线的调用。新的光线追踪管线如下:
如果说传统光栅化的管线是以一个三角形为单元,将三角形变成像素的过程,那光线追踪的管线则是以一跟光线为单元,描述光线的求交和求交后计算的过程。和光栅化线性管线不同的是,光线追踪的管线是可以通过递归的调用TraceRay()来衍生出另一根光线,并且执行另一个管线实例。这也是符合逻辑的因为在光线追踪算法里,光线的反射,折射,散射太常见不过了。
和传统光栅化管线一样,光线追踪的管线有固定的逻辑,也有可编程的部分。新管线中新增的可编程逻辑也就是新加入的5种着色器(Shader)。分别是:Ray Generation, Intersection, Any Hit, Closest Hit, Miss。关于新管线和着色器的介绍,可以参考NVIDIA和微软的博文:
Introduction to NVIDIA RTX and DirectX Raytracing | NVIDIA Developer Blog
Announcing Microsoft DirectX Raytracing!


实时光线追踪渲染与去噪(Denoising)

光线追踪在原理上相比光栅化,肯定是更加适合用来渲染许多特效的。实时渲染中对于环境遮挡,阴影,反射都有非常“近似”的求解方法。这些方法也都有因为各种近似所带来的各种问题。
例如做阴影的Shadow Mapping,因为Shadow Map的采样率和屏幕空间的采样率不一致导致需要很多人工的调节,以及各种artifact例如shadow acne,peter panning。
对于环境遮挡,传统的屏幕空间算法得到的结果往往更加像边缘检测,基本上就是把所有边角都弄暗了,而且在物体周围都会有一圈黑边。更不用提对于屏幕外的遮挡物无法计算了。
最后对于反射,现在最通用的方案是屏幕空间反射加上预计算的环境捕捉贴图(Light Probes)。这个方案的问题我在之前的这个回答里也讨论过:文刀秋二:为什么Unreal 4引擎能轻易实时渲染出vray要花半天才能渲染出的场景?对于屏幕空间反射(Screen Space Reflections,SSR),主要是没有办法渲染到屏幕外被反射到的三角形。对于Light Probes,预计算过程中通常会只计算视角光线和着色表面垂直的情况,这使得Glossy反射的结果丢失了许多有趣的特性,例如视角低角度时的反射拉长,等等。
光线追踪不一样,因为真的是在用射线采样着色点周围的场景信息,所以并没有对渲染方程做出那么多的近似。但光线追踪的问题是,对于大多数场景,渲染方程的求解都需要大量的样本才能得到一个低方差(Variance)的估计(Estimation)。离线渲染中每个像素的样本数量通常是几百到几千。这个问题更多的讨论,可以看我之前的这个答案:文刀秋二:什么是实时光线追踪技术?它可能出现在当前的次世代主机上吗?
而实时渲染,因为每一帧的时间预算只有16毫秒,能承受的样本预算远远不够我们得到一个可靠的渲染方程的解,随之而来的结果就是,因为采样数量不足,渲染出来的画面会有大量的噪点。
所以我们在NVIDIA做了很多针对极低样本数量的光线追踪结果进行实时降噪的研究,并且取得了不错的结果。在这里简单放一些我们针对阴影,环境遮挡,以及反射的成果,以及和传统算法的对比,首先是阴影:
接着是环境遮挡:
最后是反射:
关于Denoising算法的详细,我们的GDC18 Talk里面有一些算法原理的具体解释。Ray Tracing in Games with NVIDIA RTX (Presented by NVIDIA)Ray Tracing in Games with NVIDIA RTX (Presented by NVIDIA)
Ray Tracing in Games with NVIDIA RTX (Presented by NVIDIA)
但这里可以Take Away的信息是,通过Denoising算法,使得极低采样的光线追踪可以应用到实时渲染中,并且重建(Reconstruct)出非常接近用大量采样渲染得到的收敛后的图像。渲染的质量也比传统光栅算法高出非常多。
一开始提到的Star Wars Demo也用了同样的Denoising算法。


光线追踪与内容创作

引擎内置Path Tracing
光线追踪除了可以用在实时渲染中以外,另一个更加强大的功能是可以极大的便利内容创作(Content Creation)的过程。最直接的一种方式,就是可以直接在已经使用基于物理着色和光照的实时渲染引擎中实现离线的光线传递模拟算法,例如路径追踪(Path Tracing)。这对美工创建场景,编辑材质和光照的过程也许会有一个质的改善和飞跃。
试想一下,在引擎的场景编辑器内部,可以直接一键换成GPU Path Tracing的渲染模式,等个几秒钟就可以得到当前光照的最正确解。接着美工就可以根据Path Tracing的结果调整实时渲染的一些设置从而尽可能的逼近正确解。
刚才也说过,实时渲染的算法采用了无数的近似,这些近似除了有时候会造成明显的artifact以外,也有时候会造成一些着色上的偏差,例如IBL的亮度和粗糙度。在工作流中随时可以通过离线渲染来生成正确结果进行对比是非常非常有价值的。
之前为什么没有人这样做呢?首先在GPU上高效的实现光线追踪,需要对GPU架构和渲染算法本身都有深度的理解。高效的加速结构的实现,光线并行求交的实现,多线程着色的任务调度,每一个问题都可以查到多篇相关的论文,对开发者的要求非常高。然而现在有了RTX帮我们高效的处理这些底层的优化问题,并且可以用DXR的API来调用,在GPU上实现离线渲染变的前所未有的简单!
我们在将DXR整合进虚幻引擎4之后,也实现了Path Tracing。因为API的统一,极大的便利了开发的过程。我们可以毫无障碍的直接使用现有的资源,不再需要低效的interop。我们甚至可以直接使用现有的所有的Shader,只需要自己实现一些重要性采样(Importance Sampling)相关的逻辑即可。为了加速收敛,我们还把基于深度学习的Optix 5 Denoiser也用在了我们的UE4 Path Tracer里。


引擎内置光照图烘焙(Light Map Baking)
另一个对于内容创作的提升,自然就是用DXR直接实现光照图烘焙了。现在大部分引擎都会有一个外置的Light Map Baker,和引擎本身得的渲染器用的是完全不同的代码和实现。现在的工作流往往是从引擎导出场景,输入给Light Map Baker,然后Baker输出回算好的光照图(Light Map)
和刚才提到的内置Path Tracing一样,因为现在光线追踪直接正式加入到图形API中,直接在引擎内部实现基于GPU的Light Map Baker变的非常简单。我们的另一项尝试就是直接在虚幻引擎4中实现了引擎编辑器里可实时预览的Light Map Baker。我们大量复用了引擎内置Path Tracer的代码。而Path Tracer本身又复用了引擎本身的所有资源和材质Shader。所以,有了光线追踪API,无论是算光照图过程本身的成本,还是开发光照图渲染软件的成本都大大的降低了。以后也不用再维护两套渲染代码,等待计算的时间也因为GPU加速会大大缩短。


最后,刚才文章里提到的所有内容,都在我们的RTX Demo中有详细的展示:NVIDIA RTX and GameWorks Ray Tracing Technology Demonstration 再次重复,我认为这个8分钟的视频绝对是诚意满满,干货满满。
(上不了YouTube的朋友可以点这个Bilibili链接:【画质炸裂1080p】欢迎来到次世代!微软DXR&英伟达RTX实时光线追踪视频合集_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili)


总结

希望通过这篇文章,大家能更加了解到在实时图形API中加入光线追踪的意义。
首先通过最前沿的Denoising算法,光线追踪运用到实时渲染中变的可行,并且能达到超过传统光栅化方法的渲染质量。
其次是光线追踪可以更加紧密的和实时渲染引擎结合,通过实现引擎内部的离线渲染算法,光照图烘焙,极大的便利内容创作的过程。
我们的工作也都是为了给开发者一些启发,相信开发者在未来会创造出更有价值的使用方法。
The future has just begun!
页: [1]
查看完整版本: 光线追踪与实时渲染的未来