视觉技术的圣杯:光线追踪如何再现真实世界?

实时渲染视频级别的计算机三维图形是计算图形领域的终极目标,与现在普遍使用的光栅化渲染技术相比,光线追踪普遍被视为视觉技术的未来方向,可带来近乎真实的真正电影级图形和光影物理效果,光线追踪算法是达到这个目标的圣杯,经过几十年的努力,终于要接近这个理想了。

视觉技术的圣杯:光线追踪如何再现真实世界?

| 光线追踪的定义和原理

精美的CG效果图,与真实,相信大家对这些并不陌生。而大家在游戏中对水面之类的场景并不陌生,不过它所生成的画面效果,好像永远都不那么真实。即使人们尽再大的努力,它的画面始终还是动画,和人们心目中的“电影级别的画质”总是差那么一点。这是因为,我们目前的游戏,无一例外都在使用光栅化算法。而在这些电影中,则采用的是光线追踪算法。在3DSMax、Maya、SoftimageXSI等软件中,也都无一例外地采用了这一算法。

光线追踪技术是由几何光学通用技术衍生而来。它通过追踪光线与物体表面发生的交互作用,得到光线经过路径的模型。

简单地说,3D技术里的光线追踪算法,就是先假设屏幕内的世界是真实的,显示器是个透明的玻璃,只要找到屏幕内能透过人眼的光线,加以追踪就能构建出完整的3D画面。

说到光线追踪,就不得不提光栅化。

光栅化是指把景物模型的数学描述及其色彩信息转换至计算机屏幕上像素的过程。使用光栅化,我们可以将几何图形转化成屏幕上的像素。

Direct3D使用扫描线的渲染来产生像素。当顶点处理结束之后,所有的图元将被转化到屏幕空间,在屏幕空间的单位就是像素。点,线,三角形通过一组光栅规则被转化成像素。光栅规则定义了一套统一的法则来产生像素。光栅得到的像素一般会携带深度值,一个RGB Adiffuse颜色,一个RGB specular颜色,一个雾化系数和一组或者多组纹理坐标。这些值都会被传给流水线的下一个阶段像素的处理,然后注入到渲染目标。由于实时3D渲染程序要求对用户的即时操作做出迅速反应,因此通常要求每秒至少20帧以上的渲染速率,这也使得高效率的“光栅化”渲染技术成为当今最受青睐的3D即时成像技术。但是光栅化的缺点也很明显,那就是无法计算真实的光线,导致很多地方失真。

光线追踪算法分为两种:正向追踪算法和反向追踪算法。

其中,正向追踪算法是大自然的光线追踪方式,即由光源发出的光经环境景物间的多次反射、透射后投射到景物表面,最终进入人眼。

反向追踪算法正好相反,它是从观察者的角度出发,只追踪那些观察者所能看见的表面投射光。就目前而言,所有3D制作软件的光线追踪算法都是采用反向追踪法,原因是这种算法能够最大程度地节省计算机的系统资源,而且不会导致渲染质量的下降。

视觉技术的圣杯:光线追踪如何再现真实世界?

在现实世界中射到物体表面上通常有三种情况:折射,反射,吸收。光线在经过反射到不同的地方,被选择性吸收,从而光谱发生改变,再多次反射与折射,最终进入我们自己的眼睛。而光线追踪技术要做的就是模拟这一过程。

在渲染中,光线追踪会赋予每一个像素几条甚至几十条光线,然后光在场景中传播,与场景中各个物体产生交汇,而场景中的物体在事先就已经被开发者设置好了属性,从而导致光束发生各种改变,最终聚集在屏幕上。从而被我们感知。

而反向追踪方式则是计算最终射入我们眼睛的光线的反向光路,即眼睛—物体—光源的过程。因为这么做的话,可以省掉很多并不需要计算的光路,在光线追踪中,并不是每一束光都有用。有些光最终并没有射入我们自己的眼睛,但是如果依旧计算的话就会造成不必要的计算资源浪费。在光线追踪中,光同样也被分类,假设一条主光线是不可见的,那么系统则会抛弃掉整条光路,如果可见的话,那么辅助光线(反射,折射,阴影)的计算就开始了。在完成主光线的判别之后,辅助光线的其他属性(透明度,色彩)操作也已经基本完成了。

| 光线追踪在图形渲染中的应用

将光线追踪算法应用于图形渲染最初是由Arthur Appel于1968年提出,那时还叫ray casting。

1979年Turner Whitted带来了新的研究突破:递归光线追踪算法《Recursive RayTracing Algorithm》。

1984年,Carpenter等人发表了一篇分布式光线追踪的论文《Distributed RayTracing》,影响甚广。发展到今天,大多数的照片级渲染系统都是基于光线追踪算法的。基本的光线追踪算法并不难,相信大部分计算机图形学的同学都写过的,难的是如何优化提高效率

视觉技术的圣杯:光线追踪如何再现真实世界?

说到皮克斯直到《汽车总动员》才开始大规模使用光线追踪。皮克斯的《汽车总动员》于2006年6月在美国上映,如今已经8年多过去了。皮克斯一直使用的是自家开发的渲染器RenderMan,基于REYES(Renders Everything You Ever Saw)。

REYES是另一种渲染算法,它对于处理复杂场景非常高效。

1984年的时候皮克斯有考虑过光线追踪,但最终还是坚持使用REYES。那篇关于《汽车总动员》的论文《RayTracing for the Movie“Cars”》里提到五年前他们就启动了添加光线追踪功能到RenderMan这个项目,同期《汽车总动员》正在制作中。REYES在处理反射强烈的汽车表面材质方面有些捉襟见肘,只能用环境贴图,但仍然达不到光滑闪耀的质感。而这正是光线追踪擅长的。

下面介绍几个使用光线追踪的主流渲染器:

Mentalray,NVIDIA出品,已经集成到3D建模软件Autodesk的Maya和3ds Max中。

Arnold近些年日渐风行,Sony Pictures Imageworks,Digital Domain,ILM,Luma Pictures等著名特效公司均有使用该渲染器。

VRay,比Arnold大众一点,近几年也在疯长,它目前有CPU版本和GPU版本(V-Ray和V-Ray RTGPU)。

光线追踪目前多用于影视特效中做静帧渲染,但对大众最有影响的3D图形游戏领域显然还没有光线追踪的踪影,这是为什么呢?

光线追踪迟迟不能应用在游戏行业中的原因很简单——它那恐怖的计算量。即便是用了反向追踪算法之后也是如此。

根据Intel的说法,要用光线追踪渲染出达到现代游戏的画面质量,同时跑出可流畅运行的帧数,每秒需要计算大概10亿束光线。这个数字包括每帧每像素需要大概30束不同的光线,分别用来计算着色、光照跟其它各种特效,按照这个公式,在1024×768这样的入门级分辨率下,一共有786432个像素,乘以每像素30束光线以及每秒60帧,我们就需要每秒能运算141.5亿束光线的硬件。

而即便到了今天,顶级的Corei7每秒能处理的光线还不足千万条。而且这只是运算量上的差距,由于光线追踪的辅助光线每一条都没有任何相关性,这意味着包括各种缓存技术在内的“投机取巧”方式都没有用武之地,计算光线追踪辅助光线的所有的计算都将直接读取内存,这对于内存延迟和带宽来说都是惊人的考验。而且对于显存容量也是一个不小的挑战,十几甚至几十GB的显存会变的非常有必要。

虽然在游戏领域引入光线追踪是有极大挑战的事情,但这项技术一直有研究机构和图形处理器厂商在投入研究。光线追踪若想要应用到游戏中就需要做到实时渲染,就是大家所说的实时光线追踪(Real-time raytracing)。

光线追踪算法前面说过了,那什么样才是实时的?

6FPS左右就可以产生交互感,15FPS可称得上实时,30fps不太卡,60FPS感觉平滑流畅,72FPS再往上肉眼就已经分辨不出差别。

所谓实时就是需要达到每秒渲染30帧以上,否则就达不到画面的流畅度要求,就没有实用价值。实时的光线追踪的难点就在于场景复杂度和需要的真实感渲染效果决定了遍历和相交检测的巨大计算量(场景分割数据结构的重构和光线与场景的相交测试是两项主要计算)。

这是渲染领域以及任何模拟计算领域里终极的矛盾:效率和质量的矛盾。

|实时光线追踪技术发展历史

随着德国萨尔兰大学计算机图形小组所开发的OpenRT库的完成,光线追踪技术应用在电脑游戏的实时渲染中在理论上逐渐成为可能。

OpenRT函数库是源自萨尔兰大学的一个计算机图形小组的实时光线追踪项目,OpenRT实时光线追踪项目的目标是为3D游戏加入实时的光线追踪效果,该项目会包含以下几个部分:一个高效的光线追踪处理核心、以及语法与目前OpenGL类似的OpenRT 应用程序接口,客户程序员通过这部分接触之前高效的光线追踪处理核心的功能,并在游戏场景设计中调用这些应用程序接口。

萨尔兰大学除了开发出了OpenRT函数库外,还设计了一个实时光线追踪的硬件架构——SaarCOR。SaarCOR研究小组在2005年的SIGGRAPH上展示了第一个实时光线追踪加速硬件——RPU(RayProcessingUnit)。

RPU跟GPU一样都是完全可编程架构,能够提供对材质、几何以及光照等的实时编程支持。

RPU除了具有传统GPU的高效性外,最引人瞩目的就是支持光线追踪计术。其使用的指令集跟GPU一样,因此也能够对着色程序做最佳化处理。

此外,由于集成了专用的硬件单元,RPU可以支持高速光线跟踪算法跟递归函数调用,对于递归光线追踪算法同样行之有效。为了提高执行效率,RPU通常将4束光线打包处理,同时多线程计术的支持也保证了硬件资源的高效利用。

视觉技术的圣杯:光线追踪如何再现真实世界?

SaarCOR在SIGGRAPH 2005展示的RPU原型机用FPGA来构建,频率运行在66MHz,内存带宽也只有350MB/s,但是得益于特别设计的专用架构,其性能可以跟P42.6G的CPU跑OpenRT软件光线追踪的性能相媲美。

这样的性能充分体现出RPU架构在处理光线追踪方面的高效性,要知道NV当时的高端GPU可是具有RPU原型机23倍的浮点运算能力以及100多倍的带宽。

更令人兴奋的是,由于光线追踪特别适用于并行处理的天生特性,RPU可以像CPU一样采用多核架构,原型机可以搭配不同数量的FPGA芯片,比如两片FPGA就可以提供双倍于单FPGA的运算能力,而SaarCOR试验室已经测试过四FPGA的原型机。

就在SaarCOR展示了RPU之后不久,这个研究计划的人员接触到了IBM德国的技术人员,获得了一台拥有一枚CELL处理器的工程样机。在IBM技术人员的协助下,SaarCOR在短短两周的时间里就在这台机器上实现了全屏的实时光线追踪渲染效果。SaarCOR的研究人员目前已经在Cinema 4D上以插件方式实现了实时光线追踪。他们还透露了另外一个鲜为人知的消息,那就是SaarCOR其实获得了NVIDIA2.5万美元的赞助,之前的FPGA原型其实就是在NVIDIA资助下进行的。SaarCOR至今未能量产,随后SaarCOR项目并入了OpenRT光线追踪开发项目中。

早在十多年前的2004年,德国青年DanielPohl将一款电脑游戏应用光线追踪技术作为其学术研究项目。因为ID software的开源,所以《Quake3》成为了他的选择,并开始移植。

他用OpenRT对其渲染核心进行改造,令人惊讶的是在《Quake3》传统的光栅化渲染上实现光线追踪居然显得出奇的简单。例如在每个像素的动态、实时阴影仅需要10行左右的代码指令来描述光线追踪的模型。光线追踪技术的加入令整个游戏的光影效果焕然一新。画面甚至超过了很多后来发布的新游戏。之后的几年里,DanielPohl更将注意力放到了《Quake4》、《QuakeWar》等游戏上,试图在这些游戏中实现实时光线追踪算法。有趣的是,DanielPohl的实时光线追踪技术完全不依赖于GPU,仅仅是借助多核CPU的运算能力。也正因为如此,DanielPohl随后被Intel高薪聘用,正式加盟其“视觉运算部”,由此可以看出Intel决心令实时光线追踪成为现实。

视觉技术的圣杯:光线追踪如何再现真实世界?

Intel想进军独立显卡市场已经不是一天两天了。上世纪末intel就曾经出过一款独显,名叫i740。但是也仅仅就这一款而已。一心想要重返显卡市场的intel想以光线追踪来抗衡AMD与NVIDIA,所以研究光线追踪的天才程序员DanielPohl被intel收归门下,进行显卡的开发。

在2007年的IDF上,Intel正式揭开独立显卡——代号“Larrabee”的神秘面纱,Larrabee隶属于其万亿次运算项目(Tera-scale),也将是Intel的第一款实用级万亿次运算处理器,其处理能力“大大超过”一万亿次浮点每秒;根据Intel首席架构师EdDavis的演示文稿,Larrabee基于可编程架构,主要面向高端通用目的计算平台,至少有16个核心,主频1.7-2.5GHz,功耗则在150W以上,支持JPEG纹理、物理加速、反锯齿、增强AI、光线追踪等特性。

视觉技术的圣杯:光线追踪如何再现真实世界?

由于天生的CPU传统架构血统,Larrabee特别适合用来计算光线追踪。

在IDF2007的技术演示中,Intel也特意大张旗鼓地宣传Larrabee在实时光线追踪领域所取得的最新成就。但是Larrabee却并没有想象中的那么顺利,在2009年的IDF大会上,我们看到了新的Corei7系列,Atom双核,而Larrabee却被冷落在一旁,这不得不令人惋惜。、

作为一款中途夭折的产品,Larrabee在很多人的心目中应该一直都保留着几分神秘色彩,最后该项目的不了了之,还是给实时光线追踪的发展带来了些许遗憾。大家也都知道最后Larrabee的技术是用到了“众核架构”(MIC)的XeonPhi协处理器当中,成为Intel在高性能计算领域和GPU厂商的加速卡竞争的利器

就在Larrabee项目中途夭折以后,实时光线追踪技术似乎裹足不前了。但在2009年3月,一家名不见经传的初创公司CausticGraphics突然浮出水面,带来了一种具有突破性意义的实时光线追踪软硬件解决方案,号称可提速200倍,业内震惊。

其管理团队聚集了来自苹果、Autodesk、ATI、Intel、NVIDIA等业界巨头的技术与图形专家,三位创始人James McCombe、Luke Peterson、Ryan Salsbury曾经在苹果共事,其中McCombe被誉为是OpenGL世界的“第三号人物”,同时也是iPhone、iPod等嵌入式、低功耗平台光栅化渲染算法的首席架构师。

CausticGraphics声称一举解决了光线追踪算法效率低下的难题。

根据该公司的说法,他们的算法之所以独特是因为它解决了传统光线追踪算法偏向随机性的问题。新算法大幅提高了光线追踪计算的局部性,但这部分的算法需要一颗协处理器来完成。CausticGraphics的工程师们相当明智,他们对于该硬件的定位仅仅是一颗专注于光线追踪运算的协处理器,而绝不会干越俎代庖的蠢事,着色之类的传统光栅化处理依旧由GPU来完成。

视觉技术的圣杯:光线追踪如何再现真实世界?

除此以外,在2009年8月的SIGGRAPH会议上,图形处理器巨头Nvidia发布了OptiX,这是一个基于Nvidia GPU的实时光线追踪加速引擎。

在功能上,Optix引擎与前面介绍的OpenRT类似,都是一组光线追踪的函数库,Nvidia在介绍中说optix引擎基于CUDA架构,开发者可以使用C语言编程,创造出基于GPU运算的光线追踪应用。我们有足够的理由相信,Optix所用的光线追踪模型,极有可能与SAARCOR的OpenRT引擎相同,或者说OPTIX只是OpenRT的NVIDIA商用化版本。但由于光线追踪的算法和传统光栅化处理算法区别较大,现有SIMD架构的GPU内核在计算光线追踪算法时的效率不高,完全用传统GPU来加速光线追踪的做法至今也没有成功进入游戏领域。

另外,NVIDIA目前已经有virtual GPU技术,类似于云计算,不需要本地的GPU,但该技术进入大众消费市场应该还有很长的路要走。

视觉技术的圣杯:光线追踪如何再现真实世界?

| Imagination梦想照进现实

可能很多人不知道的是,在移动GPU领域呼风唤雨的另一个隐形巨头Imagination,其实也在努力摘取这个3D图像处理皇冠上的明珠,只不过它的做法比较出人意料,在2010年底突然收购了前文介绍过的创业公司Caustic Graphics,并在2013年初推出了光线追踪专用加速卡,不过该产品只针对专业市场,并未掀起业界的大波澜。但在去年3月的GDC2014游戏开发者大会上,Imagination正式发布了全新的“PowerVR Wizard”GPU家族,号称可在适合移动、嵌入式应用的功耗水平下,提供高性能的光线追踪、图形和计算能力,这次真正震动了业界(笔者看到这个新闻的时候的确是不敢相信)。

视觉技术的圣杯:光线追踪如何再现真实世界?

新家族的第一名成员是PowerVR GR6500,基于最新一代的四阵列移动GPU PowerVR Rogue设计而来,整合了PowerVR Series6 XT系列的所有特性,并加入了强大的光线追踪硬件加速电路。

硬件的优化可以分为采用GPU和SIMD的优化以及专门的光线追踪硬件。前者就是对软件算法进行针对GPU或SIMD的优化,同时一些并行环境下的数学库函数和其他基本算法,如排序等也间接起到了加速的作用。后者就是指将光线追踪中独有的相交检测,场景分割等部分采用专门的硬件来优化,G6500就是使用后面一种优化,这些专用加速电路包括:

光线数据主控(Ray Data Master):为主调度器提供光线交互数据,准备给着色器执行,并评估光线的最终数据属性。

光线追踪单元(Ray Tracing Unit):使用固定函数(不可编程)执行光线追踪遍历队列,并汇总光线一致性,以降低功耗和带宽需求。

场景层次生成器(Scene Hierarchy Generator):加速动态物体的更新。

帧收集器缓存(Frame Accumulator Cache):提供对帧缓冲的写入合并松散式访问。

从芯片的架构图图可以看出,所有这些设计都可以和GPU架构的其他模块高效整合、完美通信,生成实时、交互的光线追踪画面,而且不仅适用于移动、嵌入式平台,还能扩展到主机和主流游戏PC。更重要的是,这些模块不会影响传统图形流水线的着色性能,因为它们并非依赖着色器的浮点性能来执行光线追踪,效率最多可以达到纯GPU计算或者软件算法的100倍。

那么,PowerVR GR6500的光线追踪性能究竟如何呢?

Imagination宣称,600MHz频率下每秒可追踪最多3亿束光线,进行240亿次节点测试,生成1亿个动态三角形。由于还没有实体的芯片问世,现在只有理论数值。当年Caustic Graphics曾经透露,完全光线追踪化的游戏引擎还得等很多年,并估计至少四五年后他们的硬件才能在1920×1080分辨率下达到60FPS的有效帧率。

当时是2009年,这两年正好是这个时候,我们相信由于Imagination的支持,性能应该能够达到当年Caustic Graphics的预测水平,从而达到主流游戏的运行要求。

视觉技术的圣杯:光线追踪如何再现真实世界?

Imagination还开发了跨平台的OpenRL API,并放出了SDK,希望开发人员能够参与其中。

据说OpenRL还在申请成为国际标准,希望成为OpenGL这样的跨平台标准API。当然这个API也是来自于原来Caustic Graphics的软件开发层Caustic GL,由于其创始人具有非常强的OpenGL专业背景,Caustic并没有自己去开发一套专用的API,而是基于OpenGL ES2.0编写扩展子集,并将其命名为Caustic GL。

采用OpenRL的最大优势,就是允许开发人员像往常编写着色程序那样来编写新的光线追踪着色程序,而一些原本非常复杂的光影着色程序(用于创建复杂的光照跟投影效果)则可以由简单的光线追踪着色程序来代替,这样既可以减轻程序员的负担还可以提升硬件效率

开发人员还可以将OpenRL与其他图形API相结合,比如OpenGL3/3.1,未来甚至能够与DX混合调用。另一个有趣的特性是OpenRL并非光线追踪硬件加速电路专用,它同样支持GPU,所以在没有硬件加速电路的系统里,光线追踪计算也可以交由GPU来负责,当然效率将大打折扣。

从以上的介绍我们可以看出Imagination已经彻底把CausticGraphics的软硬件技术集成到自己的GPU里面,并由此提供了极具竞争力的实时光线追踪性能,而仍旧保持了低功耗和低成本的特色,将会给整个图形市场带来颠覆性的影响。

移动GPU第一次走在了桌面GPU的前面,相信这对于Imagination扩大整体GPU市场占有率会带来极大的推动力。Imagination也可以借此进入被NV和AMD所把持的桌面和专业图形市场。

当年ARM处理器由于性能不佳,只能退守深耕移动和嵌入式市场,不料反倒获得巨大成功成为当代最有影响力的处理器指令集架构,甚至开始进军桌面和服务器市场,Imagination似乎也开始走上了这条逆袭之路。