超能课堂(150):RTX显卡支持的实时光线追踪是什么?

今年计算机图形学上什么最火爆?那莫过于实时光线追踪了。GDC 2018上,微软率先为DirectX 12 API增加了光线追踪模块,命名为DirectX Raytracing (DXR);NVIDIA则是发布了基于实时光线追踪的RTX技术;AMD也宣布是自家的ProRender渲染引擎将支持实时光线追踪。此外诸如EA 寒霜引擎、EA Seed、Unreal 引擎、3DMark、Unity 引擎已经宣布将会引入光线追踪。但这些似乎距离我们还有些遥远,直到前两天NVIDIA发布了RTX 2080 Ti、RTX 2080、RTX 2070游戏显卡,明确表示从硬件级别支持光线追踪!那么到底什么是光线追踪?

光线追踪能达到什么样的效果?其实这个我们每一个人都体验过,绝大部分科幻、动作电影里面或多或少都会用上光线追踪这一技术。比如令人血脉贲张的《极品飞车》、《权力游戏》中的火焰、烟雾和爆炸效果仿佛身临其境,可以说光线追踪生成的影像与摄影机拍摄的影像难以区分,这就是光线追踪能达到的极致效果。但具体如何做到的,请听我娓娓道来。

其实刚听说要详细讲一下什么是光线追踪我是拒绝的,因为,你不能让我写,我就马上去写,第一里面涉及到算法、数学原理实在是太多了,因为我不愿意写的时候涉及过多公式,“Duang”一下,显得很高大上,这样观众出来一定会骂我,根本看不懂你在讲什么,那就等于白讲了。后来想了想,希望以最通俗易懂方式来讲解光线追踪是怎么回事,尽可能地少涉及到数学公式以及算法原理,因为我要让观众看到,我能理解的是这样子,你们看完之后也会是这个样子!

光栅化

想要了解什么是光线追踪,这里我们不得不提及耳熟能详的专业名词“光栅化”,因为它是光线追踪的基础,也是高效替代方案。为什么会出现这样看似矛盾的定义?

因为光栅化是一个非常宏大的概念,它有可能是指代某一个框架,也可能是具体到某一个技术上。就目前现阶段来说,我们并不愿意将光栅化放到与光线追踪的对立面上,因为光线追踪还是需要光栅化作为基础,同时起到锦上添花作用,因此现阶段实现的依然是混合渲染,两者相辅相成,缺一不可,并不是部分自媒体吹嘘的那样,光线追踪可以完全替代光栅化。

光栅化的简单原理:

按照字面意思就是把图像栅格化、像素化,将电脑生成的矢量图转换成屏幕像素点的过程。比方说,游戏中物体建模的时候都是三维,由点线面构成,但要显示在二维的显示器上,就需要一个“降维打击”——光栅化,成为能够被显示的像素点,其实就是三维向二维的转化过程,这是目前渲染的基石。

NVIDIA亲自解释光栅化过程:(不看也不影响阅读系列)

每个三角形的顶角与大小和形状不同的其他三角形的顶点相交,每个顶点关联着大量信息,包括其在空间中的位置以及有关颜色、纹理及其“正常形式”的信息,这些信息用于确定物体所朝向表面的形式。 计算机随后将3D模型的三角形转换为2D屏幕上的像素或点,可以根据存储在三角形顶点中的数据为每个像素分配一个初始颜色值。

进一步像素处理或“阴影处理”,包括基于场景中的光线如何碰撞像素改变像素颜色,以及将一个或多个纹理应用于像素,从而结合生成应用于像素的最终颜色。

这种技术的计算量异常大。一个场景中的所有物体模型可以使用多达数百万个多边形,4K显示器中有近800万个像素。而且屏幕上显示的每个帧或图像通常会在显示器上每秒刷新30-90次。

此外,还要使用内存缓冲区(为加快运行速度预留出来的一点临时空间)在即将到来的帧于屏幕上显示之前预先渲染这些帧。还需使用深度或“Z缓存” 存储像素深度信息,以确保在屏幕上显示像素的X-Y屏幕位置上的顶层物体,并且顶层物体背后的物体保持隐藏状态。

光栅化过后的平面图像其实并不真实,这是原理所决定的,因此后期图形学中出现了增强真实感的各种渲染技术,包括“全局照明”、“环境光遮蔽”、“漫反射”以及“软阴影”,他们都是意图用更低开销实现更真实的光照效果。

由于都是通过算法来实现,并没有统一标准,游戏开发商可以自行选择并使用,因此我们看到一些游戏里面有各种光影特效,而另一些游戏中就没有。如此之多、五花八门的技术就是为了创造以假乱真的光照效果,其实说到底就是我们的显卡算力太弱了,只配用这种近似解的方案。

图片来自artofvfx

光线追踪

而在电影行业中,早就用上了我们提及的光线追踪,他们已经有相当成熟的解决方案,完全可以达到以假乱真的效果,你看看漫威的科幻大片,是不是给你一种异常真实的错觉?没错,这就是光线追踪的魅力。

至于为什么电影行业能这样做,原因不外乎有两个:一是有时间,他们采用的离线光线追踪,是要慢慢一帧帧渲染出来;二是有钱,通常特效工作室会使用到NVIDIA所说的渲染农场,不是一台电脑在算,而是一个个渲染集群服务器在工作,算力是你机箱里的GTX 1080 Ti成千上万倍,因此它们可以这样玩。

光线追踪的历史

其实光线追踪并不是近几年才有的概念,它的历史甚至可以追溯到上世纪70年代。

1968年,Arthur Appel在其论文《 Some techniques for shading machine rendering of solids》提出Ray Casting(光线投射)的新概念,这也是后来光线追踪的基石。

其具体思路是从每一个像素发出一条光线,然后找出会挡住传播路径的物体,那么只要计算被挡住之前的传播路径(直接光照部分),而视平面上每个像素的颜色取决于从可见光表面产生的亮度。

1969年就任于IBM的Arthur Appel在《Some Techniques for Shading Machine Renderings of Solids》论文中首次提出Ray Tracing(光线追踪)。此技术可追踪通过2D视平面上每个像素发射的光线路径,并应用到场景的3D模型中。

但一直等到10年后的1979年,Turner Whitted才继续在论文《An Improved Illumination Model for Shaded Display》中,具体解析如何捕捉反射、阴影和反射。在光线投射的基础上,加入光与物体表面的交互。

光线追踪主要思想是从视点向成像平面上的像素发射光线,找到阻挡光线传播的最近物体,如果交点表面为散射面,则计算光源直接照射该点产生的颜色;如果该交点表面为镜面或折射面,则继续向反射或折射方向跟踪另一条光线,如此往复循环,直到光线射出场景或者达到规定计算次数(还是为了节省资源)。这个方法被称之为经典光线跟踪方法或者递归式光线追踪方法。

顺带提醒一下大家,Turner Whitted作为光线追踪的创始人,目前就任于NVIDIA 研究事业部,所以你能理解NVIDIA为什么那么热衷于光线追踪追踪了吗?

光线追踪目前的瓶颈——计算量庞大、小样本计算噪点

光线追踪是三维计算机图形学中的特殊渲染算法,它与之前计算光源光线传播路径不一样,利用光的可逆性质,反向计算,跟踪从眼睛发出的光线,通过技术生成编排好的数学模型展现出来,这样的得到画面效果更佳,对于反射与折射有更准确的模拟效果,并且效率非常高,因此在电影制作过程往往会采用这种高质量的渲染方式。

但很遗憾,光线追踪最大缺陷在于对算力要求极高,计算量非常庞大,目前的单一硬件很难满足实时光线追踪的需求。光栅图形学中的算法,利用了数据的一致性从而在像素之间共享计算,而光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。所以尽管电影特效工作室有庞大的计算集群,但他们也会“偷懒”,只有在关键帧、关键元素上采用光线追踪来处理,其余部分依然使用光栅化进行渲染,依然能够提供非常出色的画面效果。由此可想而知计算量之大。

按道理来说,每一条光线都有自己的计算,可以正确地处理出光线反射、折射等光学现象,但实际出来的效果有可能与真实情况不一样。这因为最终的画面是求解通过渲染方程得到,但有时候方程式解不出来,只能利用蒙特卡洛积分做近似解,需要用到大量的样本进行求解,在电影使用的离线渲染中,由于没有计算时间限制,他们通常会采用几百到几千以内大样本进行计算,出来的光线追踪效果会更好。

一旦用到游戏上就不同了,要达到60fps,也就是一帧只有16ms时间给你进行光线追踪运算,那么样本只能尽可能小,这样就会导致出来解不够准确,画面会有大量噪点。

NVIDIA开创了实时光线追踪新时代

NVIDIA已经预料这一点,针对极低样本数量的光线追踪结果进行实时降噪的研究,并且取得了不错的结果,最后成为GameWorks SDK 中一个光线追踪降噪模块,也就是Denoising算法。最终可以用比较低样本的光线追踪应用到实时渲染中,最终渲染质量可以媲美大样本下的光线追踪收敛图像。

另一方面,随着显卡计算性能日益提升,NVIDIA认为显卡加入硬件级光线追踪支持的时机已经成熟,光线追踪也会成为未来3A级游戏竞相使用的技术,以达到玩家们梦寐以求的画面效果。因此NVIDIA在经历Volta游戏显卡跳票后,带来了拥有专门处理光线追踪的RT Core的Turing游戏显卡,不仅仅可以让游戏开发者进行实时光线追踪计算,所见即所得,而玩家也能从游戏中感受到前所未有、电影级的画质。

就像NVIDIA所说的那样,图灵架构显卡凝聚了过去10年里在计算机图形算法和 GPU 架构领域所取得的成果。

(0)

相关推荐