渲染器是一种软件,它采用所有的模型、动画、纹理以及灯光和其他场景对象,并通过计算光线如何在虚拟场景周围反射并为对象着色来生成构成动画电影的最终图像。而 Hyperion 是迪士尼的内部渲染器,是一个基于物理的路径跟踪器。
今天的文章将详细讲解 Hyperion 渲染器的操作方法和路径跟踪原理,带您了解独属于迪士尼的制作技术。
路径跟踪
那什么是路径跟踪(path tracing)呢?其实路径跟踪就是一种通过模拟光线如何与虚拟世界中的物体相互作用来生成数字图像的方法。
通过将光线(线段)射入场景并在它们在物体之间反弹时跟踪它们来追踪光的路径。路径跟踪得名于计算从光源到相机的完整光线路径。通过将沿路径的所有光线收集在一起,可以计算光源和沿路径的表面的贡献。这些计算用于生成最终图像。
在路径追踪的许多版本中(包括Hyperion采用的方法),路径从相机开始并拍摄到场景中以找到与光源的连接。这与光线在现实世界中的行为相反,但通过向后执行此操作,可以更容易地找到实际击中相机的光路。
使用 Hyperion 渲染的前后对比
说到这问题就来了,为什么是路径跟踪?这种技术能够产生高度的真实感。因为虚拟场景中灯光和物体之间的所有交互都是模拟的,所以可以捕捉到诸如折射和光泽反射等效果。
使用 Hyperion 渲染的前后对比
最重要的是,迪士尼可以生成具有间接照明的图像,其中考虑了从虚拟对象反射的光。即使是多次反射的光(称为多次反射光)也会对场景产生影响,包含微妙和不那么微妙的照明效果。
这些框架展示了多次反射光对大白在楼梯中的外观的影响。在图片中,注意通过大白发出的柔和的间接光,使他看起来像之前图片中的乒乓球一样半透明。
Hyperion 制作方法
Hyperion 是如何制作图片的呢?在迪士尼的动画电影中,制作过程会遇到非常庞大和复杂的场景,比如《超能陆战队》中的城市旧金山。
这对任何试图模拟现实照明的渲染器来说是一个挑战。如果使用典型的路径跟踪技术,光线会随机反弹,以不可预知的顺序遇到物体,那这可能会导致大量的时间浪费,尤其是在复杂的场景中。
为了解决这个难题,迪士尼使用了自己独特的路径跟踪方法。Hyperion 通过根据方向将它们分类和捆绑在一起,一次处理数百万条光线。当光线以这种方式分组时,束中的许多光线会击中同一空间区域中的同一物体。
光线命中的这种相似性使团队以及计算机能够优化对命中对象的计算。多亏了这个新方法,迪士尼可以渲染整个旧金山,而无需借助绘画来模仿远处的风景等技巧。
这让动画可以将观众的视角放在大白的肩膀上,因为他可以不受任何限制地飞速穿过旧金山。
Hyperion 是一种流式光线追踪器,能够在生产规模的场景中执行多次反射全局照明,而无需求助于阴影缓存或实例化。为了实现这一点,迪士尼引入了一种新的两阶段光线排序框架。
首先,团队对大型的、潜在的核外光线批进行排序,以确保一致性;其次,使用核外纹理对光线命中进行排序,以实现延迟着色。对于每个批次,通过顺序纹理读取实现完美连贯的着色,消除了对纹理缓存的需要。这样的方法易于实现并且与大多数场景遍历策略兼容。
路径追踪操作指南
通常一部动画电影大约有 100000 多个帧组成,成百上千的艺术家用他们的双手将一幅幅画面制作到屏幕上。下文将要和你们分享其中一个图像是如何制作的。
很简单,好好想想这一帧画面。首先,我们要清楚屏幕上的所有图像,就像一张白纸,框架上什么都没有,没有任何东西可以工作,直到被创建出来。
让我们从一个镜头的图像框架开始,想象一下这个框架就像你家的窗户,打开它你就会看到外面地平线上的小山丘,还有小溪、岩石和树木,你可以看到天上的太阳。
我们都知道,太阳有闪耀的光芒,光芒会落到大地上,直到击中地球上的物体。比如落在这块石头上,然后你就可以看到它了,岩石不会吸收所有光线,实际上岩石会和光线相互作用,这要取决于岩石是由什么组成的,以及它的表面结构是怎样的,从而决定光线的反弹方向是怎样的。
假设岩石的表面是光滑且反光的,表面就像一辆崭新闪亮的汽车,这就会导致太阳光线反弹,然后光线会投射到树的表面上。
但光线并没有停留在树的表面,它可能会从树的表面反弹进入到树叶上,并让它们稍微亮起来,然后一次又一次的反弹,就像台球桌上的台球一样,直到那一缕阳光最终失去了所有的能量。
需要理解的是,并不是所有的太阳光线都是直接照射在树和岩石上的,而是通过像这样的间接路线。其实我们大多数的阴凉地方并不是漆黑一片,大部分都是可见的,因为光线会投射到那里。但这只是一个光的例子。
想象一下每一缕阳光,然后再想象一下百万亿束的光线,有无限的光路径,照亮我们所看到的一切,到处都是光线。这是在现实物理世界中的作用。但是在动画电影中,让我们看看计算机是怎么做的。
想象一下当你在电脑显示器中看到一个虚拟的场景窗口,场景或世界中的所有对象都是三维模型,它们在这里表示为线框对象,这就是它们在电脑上的样子,动画师的工作就是用纹理来描绘它们。
让我们仔细看看树下的那块石头。当我们创建场景时,同时可以把这个岩石的表面设计出来,同样光线会从它的表面反弹。假设这块石头非常光滑,当光线击中它时,会均匀的反弹回来,或者我们应该让石头表面凹凸不平,那么光线如何反弹,则更多都是不可预测的行为。
这就是所谓的表面现象。场景中的每一个物体都有它自己的表面指向,决定它如何与光相互作用。
但这并不决定对象本身的外观,如果这块岩石是由大理石和花岗岩制成的光滑岩石,我们可以直接设计创造我们想要的岩石。现在我们的树下有一块美丽的花岗岩,具有光滑的反光表面。
在计算机内部构建此图像画面的过程称为渲染。计算机要对我们所看到的每一条光线进行计算,在这一场景中需要进行数以百万计的计算,这些计算需要时间,同时也会超过计算机的能力。
那么我们该如何解决这个问题呢?把光线数降到我们需要的或者是可计算的就行了。在我们的场景中,每一次光线从一个物体反射到另一个物体,计算机需要计算它的新轨迹和它的方向。
一些光线可能会射到岩石上,而另一些会射到河里,有些会射到天空中去,我们永远不会有机会见到它们,这些不在框架中的关系,计算它是没用的。
高效渲染
为了更高效的渲染,我们会使用路径跟踪的方法。此方法将整个过程进行反转,它只考虑摄像机可见的光线路径。路径跟踪是让光线从摄像机发射,光线会追踪到场景中的物体上,然后回到光源。
这样每一个相关的光线都被记录下来,它不会浪费时间去追踪那些永远都看不到的光线。
但是我们如何才能更有效率的工作呢?为了回答这个问题,我们需要了解计算机是如何工作的。每次我们告诉计算机要创建一个摄像机射线,它必须计算光线弹射。
举个例子,第一步我们要求光线从相机出发,并射中那块岩石,接着岩石表面的属性将告诉光线该如何继续弹射;第二步则是假设岩石会反射,那么计算机会开启一个新的计算来绘制下一个方向的射线;第三步的时候它会遇到另一个物体;第四步,再遇到另外一个物体。最终光线会追踪到光源。
计算机的处理能力也是很让人头疼的,因为它需要计算每条光线,以及在物体表面的弹射,每一个图像可能需要做上百万甚至数十亿次的计算。你可以看到计算机经常因此而瘫痪或罢工。
摄像机的光线一次不能只发射一个。相反,在整个象棋的框架内会发射出数百万条射线。第一组射线进入镜头,捕捉镜头所能看到的一切。但是一次肯定不够,我们需要多弹射几次,让画面看起来更自然。
一条光线可能需要反弹 4、5 甚至 10 倍以上才能创作出我们想要的样子。一旦我们的射线离开摄像机,散射到场景中,事情就变得复杂起来了。我们的电脑想要均匀地渲染这些光线,但是没有固定的射线模式,光线是随机的。
计算机会尝试抓取每一条光线并尝试渲染。就像你在家做数学题,同时又要做历史作业,你一次只能做一种作业,不能同时进行,难以随意切换。
其实计算机的工作方式也差不多,如果一条光线射进河里或者灌木丛中,这都无所谓,因为它不知道用其他方法来渲染这些射线,但它能一次处理 10 道数学题或者一吨的历史报告。
通过计算机你可以批量处理场景中的射线路径和方向。因为有的射线方向相同,具有相似的特征,而我们可以将它们批量处理并进行计算。
看这些射线他们的方向是相似的,将他们打包在一起。我们也可以把部分光线进行分组,诸如此类。直到我们渲染第二次反弹的整个过程。这叫做射线分选,这是我们路径跟踪渲染的方法。
我们重复这个分选过程时是第三次反弹。但需要多少次,还是要看场景的设计如何。通过将相似的任务组合在一起,我们可以在相同的时间内追踪更多的光线。这样的效率更高,它减少了在不同任务之间切换的开销。因此它使我们的场景渲染得更快,让我们的艺术家能创造更精美的图像。
总之,使用这三种方法,我们可以建立我们的场景,物体的表面属性决定光线如何与物体相互作用;绘制物体的纹理,并组织光线使我们的场景可见;用光的物理来创造我们的真实的世界。
想要学习更多动画制作技巧与干货,别忘了关注动画手册的其他精彩文章。