自从2018年3月在GDC首次公开以来,虚幻引擎中的实时光线追踪技术在过去的18个月里已经有了长足进步,而且还在继续发展。本文概述了它从原型代码到经过实测的免费功能的历程,我们将在其中讲述这种技术的发展以及未来的进步空间。
言归正传,什么是光线追踪?
首先还是让我们快速给出光线追踪的定义,并概要论述它与光栅化的区别,后者是实时光线追踪出现前在游戏引擎中使用的传统渲染方法。光线追踪是一种决定在最终渲染中每个像素颜色的方法,它以摄像机为出发点,追踪光线在场景中到处反射的路径,在此过程中收集并储存颜色。因为它模拟了光的实际行为,所以能提供比光栅化逼真得多的结果,例如柔和的、带细节的阴影,以及来自屏幕外物体的反光。
另一方面,光栅化的工作方式是在场景中从后向前绘制物体,通过变换矩阵将3D物体映射到2D平面。它根据网格体上存储的信息(颜色、纹理、法线),结合场景中的光照来确定每个像素的颜色。通常它要比光线追踪快得多,但无法描绘出真实反光、半透明和环境光遮蔽等依赖反射光照的效果。
技术催化剂
光线追踪已经被追求极致真实影像的人们在故事长片中使用了几十年。但是直到最近,对达到影视级分辨率的一帧画面进行光线追踪运算还需要几个小时甚至几天时间。以24帧/秒(fps)或更高速度渲染光线追踪画面是难以想象的。后来同时出现了两种改变业界格局的技术:微软的 DXR(DirectX光线追踪)框架和英伟达的RTX平台。Epic Games与英伟达和ILMxLAB合作,在GDC 2018上通过我们的Reflections技术演示短片首次展示了实时光线追踪技术,出演该短片的是《星球大战:最后的绝地武士》中的角色。
“Reflections”中的影像
这部短片演示了纹理区域光源、光线追踪区域光源阴影、光线追踪反光、光线追踪环境光遮蔽、影视级景深和NVIDIA GameWorks光线追踪降噪——全部都是实时运行的。由于虚幻引擎综合采用了多种方法,不能受益于光线追踪的通道将继续使用光栅化技术,大大提高了整体性能。
光线追踪区域光源阴影
这时候该技术处于发展初期。虚幻引擎原始代码尚未对用户提供;实时运行该演示短片所需的硬件是一台装有四个Tesla V100 GPU的NVIDIA DGX工作站,其价位在100000美元左右——因此无论软件还是硬件,都不是普通用户所能企及的。
实时光线追踪的平民化
5个月以后,在SIGGRAPH 2018上,我们再次与英伟达合作,并联手保时捷,推出了实时电影式体验“The Speed of Light”保时捷911超跑概念短片。在摩尔定律的影响下,这个演示只需要两块NVIDIA Quadro RTX显卡——当时每块的售价超过6000美元,仍然是一笔相当大的投资,但已经明显比先前的配置便宜了。“The Speed of Light”中的影像
除了先前演示的功能外,The Speed of Light还展现了光线追踪半透明和透明涂层着色模型,以及弥散全局光照。团队除了制作短片,还创作了一个交互式演示来展现场景的实时性。
光阴如箭,转眼就到了今年3月的GDC 2019,我们已经做好了在虚幻引擎4.22中以测试版形式提供光线追踪功能的准备。为了展示这种技术在12个月里的进步有多大,我们的合作伙伴Goodbye Kansas和Deep Forest Films创作了一部以数字化人物为主的实时短片Troll。
“Troll”中的影像
Troll的复杂程度比Reflections高出一个数量级。虽然两者都是以24 fps速度运行,但Troll有6200万个三角形,而Reflections只有500万个,前者有16个光源,后者只有4个,前者的光线追踪通道是以全1080p分辨率渲染的,而Reflections是按折半分辨率渲染并放大的。Troll还需要对粒子进行光线追踪,以及与虚幻引擎电影摄制管道中的其他基本组件(包括Alembici几何体缓存、毛发和皮肤)进行互操作。虽然包含这许多特性,Troll却只用了一块NVIDIA RTX 2080 Ti显卡渲染,它的当前售价是1199美元。“Troll”中屏幕空间反光(左)和光线追踪反光(右)的对比
如今,相关软件已经包含在虚幻引擎中免费提供,显卡的需求也不会让用户破产,实时光线追踪已经成为人人可用的技术。
虚幻引擎4.23中的光线追踪
当我们为了在虚幻引擎中首次实现光线追踪而努力写代码时,微软在对DXR框架做最后的调整,而英伟达也在开发新的硬件和驱动程序。此外,为了支持光线追踪,我们对渲染管道进行了重大重构。在SIGGRAPH 2019上预览的虚幻引擎4.23中,我们下功夫处理了这两种因素造成的不稳定问题。我们还改进了许多方面的性能,包括天空通道、全局光照和降噪。降噪对于实时光线追踪很重要,因为我们能够追踪的光线数量的预算是非常有限的。
在Evil Eye Pictures制作的短片“emergence”中,全局光照得到了很好的运用
我们还实现了交叉着色器,使用户能够支持自己的Primitive类型,并渲染毛发或不规则碎片等复杂几何体。我们已经开始着手支持多个GPU;在4.23中添加的低层次支持可控制由哪个GPU来渲染某个通道。我们还会继续支持更多材质和几何体类型,包括地形几何体、实例化静态网格体、程序性网格体和Niagara Sprite粒子。
UE4中实时光线追踪的发展道路
我们还没有大功告成!Epic的团队仍在努力改进我们的实现。虽然我们的4.23版已经在性能和稳定性方面取得巨大进步,但我们还需要在这些方面做许多工作才能使这一功能正式达到产品级标准。不过,我们有太多用户不在乎这一点,他们正在开心地把当前的测试版代码用于实际作品。他们正在替我们对这些代码进行压力测试,这让我们很高兴,我们内部的《堡垒之夜》动画团队也在做着同样的事,他们确实一直在鞭策着我们。先前提到过,我们已经在4.23中添加低层次的多GPU支持,不过我们希望大大提高它的“即插即用”性。另外我们也始终在致力于支持更多几何体类型。最有挑战性的例子之一就是带场景位置偏移的植物叶子——这对于某些效果是必需的,比如叶子被风吹动——我们正在努力研究某些办法。
如果你想对我们迄今为止的工作有更深入的了解,请看一看这个SIGGRAPH 2019上的技术讲座。