作者:Kristof Beets,Imagination Technologies PowerVR产品管理资深总监
我们所处的世界充满着由太阳或其他人造光源发射出的数以亿计的光线。当光照射到物体表面时,光线会以各种方式反弹、分散和反射,直至最终到达我们的眼睛。正是这种复杂的交互作用创造了我们的现实“视界”。光线追踪是一种用于三维(3D)图形的照明技术,它可以模拟真实世界中的光线照射方式。虽然它能产生最逼真的效果,但是从传统上看,其过程对于计算机而言还是过于复杂,以致无法实时创建三维图形。
如今,它被广泛用于为广告和电影创建超逼真的渲染效果,但是在这些应用中,即使利用当今功能非常强大的计算服务器,生成每一帧数据仍需花费数小时。光线追踪是个时髦词,作为实时图形的发展方向,它令人们感到非常兴奋(也有人将其视为炒作,这取决于你的看法)。在本文中,我们将认识光线追踪,并了解实现它的方法。
简化问题
在三维游戏中,场景由各种物体组成,当这些物体组合在一起时,就会形成数百万个三角形。光线追踪最基本的功能就是发射出一条光线,然后沿着它在三维场景中的路径来定位它所到达的第一个物体,进而确定应该如何对该物体进行照明。然而,用场景中的每个物体去测试一条光线以确定它们是否相交,这样的做法效率太低、计算成本太高,完全无法实时进行。
因此,为了使用光线追踪技术,我们需要解决这一问题。
这可以通过建立光线追踪加速结构来实现。为了做到这一点,我们可以围绕整个游戏场景绘制一个方框,然后将其划分为多个较小的方框,再将这些小方框细分为更小的方框,我们按这种方式不断将方框进行细分,直到小方框中的三角形数量达到便于管理的程度为止。我们将其称为场景层次结构,它帮助我们将问题简化到一定程度,使现有的图形处理器可以有效地进行处理。
这种方法之所以有用,是因为当我们向游戏场景中发射光线时,可以根据场景层次结构逐层进行检查。首先,我们要检查光线到底有没有射入最大的方框(即我们的场景)。如果有,我们将继续检查下一层的小方框。在这个阶段,我们会发现光线射入了一些方框,但没有射入另一些方框。接下来,我们可以不断将光线未射入的方框排除在外,只重点关注光线射入的那些方框,直至我们找到光线与三角形相交的地方。至此,我们终于找到了自己的目标。
这种层次结构使我们能够找到光线和三角形最近的交点,而不必测试场景中的每个三角形。这极大地简化了问题,因此可以更快地完成处理过程。
在几何处理阶段(该阶段硬件会完成物体的动画处理工作)之后,我们会将那些三角形置入一个称为场景层次生成器的专用硬件中,该生成器可以生成上面所述的加速结构。我们还添加了一些专门的光线/方框/三角形测试器,它们是专用的固定功能硬件,用于通过加速结构进行光线追踪,并确定光线与三角形的交点。与使用软件可编程管线相比,在专用硬件中完成所有这些操作要快得多,而且更节省面积和功耗。
那么,当硬件确定光线照射到一个三角形之后,下一步该做什么?接下来我们会触发一个片段着色器,这是一个小程序,可以确定该三角形特定位置的颜色,这一步和传统的渲染方式基本相似。然后,通过该片段着色器程序,我们将更多的光线发射到三维场景中,随着此过程的不断重复,就可以建立起我们的光线追踪场景。
一致性问题
但是,现在我们又有一个新问题。我们向场景中发射了大量光线,那么该如何高效地进行所有处理工作呢?我们需要从存储器内的加速结构中获取方框和三角形,并且当每条光线每次照射到一个物体上时都会触发一次片段程序。
不幸的是,光线是不稳定的,它们不一定会沿着同一方向传播。在专业术语中,我们将此描述为不一致性——这会带来问题。不一致的数据访问对现代的图形处理器(GPU)来说是不利的。这有点像在按字母顺序排列的名片簿中查找信息,但给我们的名字却是按完全随机的顺序排列的——这就需要我们不停地来回翻查,会占用宝贵的时间和精力。
更糟糕的是,当光线随机地向四处反弹时,它们还会照射到不同的物体和三角形上,这些物体和三角形需要分别着色和添加阴影,这将触发不同的着色器程序。然而,GPU喜欢以并行方式处理着色器。这正是GPU的强大之处:以大规模并行方式处理数据的能力使其比其他处理器(如CPU)更具优势。这是因为GPU的算术逻辑单元(ALU)本质上采用了单指令多线程(SIMT)方式。但是,如果每条光线会触发一个不同的着色器,那么将无法在GPU上运行,因为这需要多指令多线程(MIMT)架构,该架构在芯片面积和功耗方面的效率都很低。
针对此问题的一种解决方案是采用Imagination Technologies开发的一致性引擎,该引擎可以追踪光线,并且在场景中所有混乱的光线之间找到秩序。
如果你看下面的图片,一开始可能会觉得光线是随机的。但是,如果你更仔细地观察,会发现实际上是存在一致性的。
为了更清楚地对此进行解释,请注意图中物体的某些部分是如何反射相同黄色对象的。尽管看起来很混乱,但还是会发现有一些光线是沿着同一方向传播的,并照射到了相似的对象上。我们的一致性引擎会对此进行查找,并将这些光线分组,从而使它们更易于被GPU处理。这就是“魔法”,我们重新实现了高效的数据访问和执行,从而降低了处理的功耗以及对带宽的需求。
混合渲染的好处
太好了,我们现在可以高效地进行光线追踪了。然而,正如我们前面说的,现实世界中会有数以亿计的光线向四面八方反射,从而形成我们眼睛看到的图像。因此,即使考虑到我们实现的所有效率提升,使用光线追踪来创建整个场景仍然是有问题的。那么解决方案是什么?混合渲染。
虽然传统的栅格化渲染在如今是一种很好的方法,但它却困扰于空间交互问题,例如灯光/阴影、反射和折射——而这些复杂的事情正是光线追踪所擅长的。通过混合渲染方法,我们可以同时利用两者的优势,对简单的物体使用栅格化渲染,然后从着色器发射一些光线,并有选择性地创建数量有限的空间光线追踪查询,进而创建超逼真的阴影、照明效果和精确的反射。通过使用这种混合渲染方法,我们极大地减少了所需追踪的光线数量,这最终使我们实现了实时性能。
手机上的光线追踪:真的会实现吗?
答案很简单:是的,会实现。如今智能手机中的GPU相比其首次推出时已经取得了巨大的进步,这不仅体现在功能方面,在实际可实现的性能方面亦是如此。事实上,高端智能手机已经突破了1 TFLOPS(每秒万亿次浮点运算)的计算壁垒,而这曾是专用游戏机的专属能力。这其中的核心问题是效率。智能手机依赖于电池续航时间,而光线追踪相比传统的渲染方法更高效,因此它很有可能会很快地被添加到移动设备体验中。
利用上述创新,Imagination可以实现高效的光线追踪。在智能手机中,使用传统的栅格化方法在游戏中“伪造”阴影和反射的成本非常高。在Unity或Unreal等现代游戏引擎中,反射是使用级联阴影贴图生成的。这需要多次渲染屏幕中的几何体,并将阴影贴图查找表写入存储器中,所有这些操作都会消耗周期和带宽,并产生大量的GPU和系统功耗。
通过使用光线追踪,我们可以向光源发射一条光线,如果该光线碰到了光以外的任何东西,我们就知道该片段处于阴影中。所以,使用我们简化且高度优化的光线追踪解决方案会简单得多,相比级联阴影贴图所需的预处理,它是一种功耗更低的解决方案。
在分析我们自2016年以来的原型光线追踪硬件时,我们发现相比阴影、反射和其他技术,光线追踪的功耗通常不到一半,但获得的质量却高得多。这里需要意识到的是,一种复杂但“虚假”的技术比简单的光线追踪技术功耗更高,而光线追踪技术实现的效果却逼真得多,这使得它不仅适合现代的高端智能手机,而且是非常理想的选择。
人工智能和超分辨率
虽然在智能手机中应用光线追踪是一种选择,但我们同样对云游戏的日益普及感到兴奋,这得益于5G网络和边缘计算的发展。在云游戏中,我们的光线追踪架构所实现的带宽和功效很可能也是至关重要的。
我们需要不断地进行创新,才能以更少的成本实现更多的成果,因此,我们对人工智能(AI)处理的飞速发展感到非常兴奋。再加上神经网络,它们可以与光线追踪结合使用,从而提供更高的效率。例如,当我们为了提高效率仅追踪相关光线时,可能会得到含有噪声的结果。神经网络在降噪方面有很好的前景,可以利用学到的“智能”来填补缺失的细节。这和现实中的工作方式是一致的,因为我们的大脑也会填补有限的人类视觉系统留下的许多空白。
另一个极具潜力的概念是超分辨率。它同样是利用神经网络的能力,去智能地学习如何填补缺失的细节,以支持GPU以较低的分辨率进行渲染,从而提高性能并降低功耗,同时仍然保持视觉质量。
面向未来
毫无疑问,实时光线追踪拥有光明的前景,这对于任何对三维图形感兴趣的人来说无疑是令人兴奋的。由于光线追踪基于真实世界的物理原理,因此可以提供最高水平的真实感,同时相比我们迄今为止一直在使用的技巧和近似方法,它还可以提供很高的效率。低功耗的栅格化图形处理、开创性的光线追踪操作,再加上人工智能和神经网络的持续创新,所有这些结合在一起,有助于将图形处理提升到一个新的高度。
作者简介:
Kristof Beets,现任Imagination Technologies的PowerVR产品管理资深总监,他已在Imagination工作超过19年,先后担任过各种开发、产品和营销职位。
申请转载文章
公众号:物理演示实验室(UPC-Phy-Demo-Lab)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !