115650lf4gx4vf2ko4jfgc.jpg
  GameRes游资网授权发布 文 / 文刀秋二

  星际穿越中的关于黑洞的渲染软件的制作,这是如何通过设计电脑程式渲染出来的?这里要讲到一种电脑程式——光线追踪。我先简单做一个简单的光线追踪 (Ray Tracing) 的介绍。

  考虑一个最简单的情况,对于计算机来说,绘制图片,本质就是要计算出每一个像素的颜色。首先要解决的一个问题就是知道每一个像素是对着场景的哪一个部分。现在的图形处理器(GPU)使用的算法叫做光栅化(Rasterization)。这种方法的做法是将定义在一个三维坐标系里的场景里的每一个顶点Vw(x, y, z)乘以一个投影矩阵,转换成一个个屏幕空间的点Vs(x, y)。就好像把一个你面前的三维场景压扁到你眼睛前的一个平面上一样,这个过程叫Projection,见下图。等这些点被“压扁”之后,光栅化利用这些已经在屏幕像素空间上的点来正确的填上每一个像素(省略了无数细节,例如投影的时候多个三维中的点可以对应一个二维屏幕上的点,要用深度测试来保证留下的是离眼睛最近的)。投影有许多种,例如CAD制图常用正交投影。游戏和电影用的更多的是基于模拟pinhole camera的透视投影(下图)。不同的投影视觉效果不同,但都会把三维的场景拍扁到你眼前的屏幕上。

115447uox7n8fu6u3u4nxo.jpg
  光线追踪则用了和光栅化相反的方法。它不需要通过乘以矩阵来把场景”拍扁“,反之,它会从每个像素发射一条射线,光线最先打到场景的什么东西,这个像素就会被这个东西占据(下图)。所以其实光线追踪更加直观一些。但是数学上,这两种方法是等价的,都是把一个三维的场景投影到了二维的屏幕上。实际上,光线追踪里射出射线的方向的参数和光栅化里投影矩阵的参数是一样的。例如如果是正交投影的话,光线追踪会射出一堆互相平行且都和投影平面垂直的线。透视投影的时候,投影矩阵的视锥角度越大,光线追踪射出的射线也就越分散(这个视角和你们玩单反里的是一样的)。总之,这两个过程是等价的。

115447zfxxf5zqtn2kwwa2.jpg
  再简单说说为啥电影特效用光线追踪。简单的说就是因为计算每个场景表面上的光照的时候,某一点的颜色是和这个点周围有什么东西有关的(全局光照),周围的所有物体有可能发光照到它,有可能间接反光给它,也有可能挡住照着它的光(下图)。为了知道这些信息,只能从这个点再朝着周围射很多射线才能知道这些信息从而计算出这一点的颜色。要计算射线和场景的交点是很expensive的,目前又没有比较好的硬件加速方案能做到实时,所以游戏一般不用光线追踪。

115448au4kp1okmp6ucc2k.jpg
  对游戏来说,往往不需要计算全局光照(不需要),光栅化又实际上就是把一堆三角形一个个stream输出到屏幕上的过程,这个过程并不像射线求交那样一次需要把整个场景放在内存里,又易于pipeline和硬件加速,可以快到实时。所以游戏都用光栅化啦。

  不知不觉废话了一堆科普,现在我来说说星际穿越的创新和特殊性。之前用于做电影特效的光线追踪程序都基于一个假设,即光线永远是沿着直线传播的。而星际穿越则打破了这个限制,它让光线因为黑洞的引力而弯曲了。我认为这个技术主要运用的场景就是虫洞和黑洞。拿黑洞举例子,电影里我们看到的黑洞是这样的:

11544961vv5fu2lz4v96g4.jpg
  一个黑球被垂直和水平的两个光环包住,好奇怪的形状是不是。实际上,黑洞周围的光环只是很普通的类似小行星带那样的光带而已,这个奇怪的形状就是引力弯曲了光带发出的光线所致的。如果我把这个黑洞模型丢给一个传统的光线追踪/光栅化渲染器,绘制出来的图片的效果应该是这样(网上没图,我就自己手画了,丑请包涵):

115449hqq4dw7khnkdx7xw.jpg
  看起来就是类似普通的行星嘛。可以理解成在这里光线直线传播,也可以理解成场景被那个透视投影矩阵“拍扁”了。但是星际穿越的特殊性在于在这个场景里面,光线不再是直线传播的了,所以用传统的光线追踪,或者用投影矩阵去拍扁都不work了。他们实现了一个光线沿着引力曲线传播的渲染器,用同样的示意图画出来大概是这样:

115449zqne3dh80euvvd4e.jpg
  所以黑洞上下部分的光环在实际的场景里是应该被黑球挡住的,但是因为它们像周围发射的光线就像地球发出去的卫星一样被,轨道被引力拉弯了,所以我们在黑球的上面看到了本应出现在黑球后面的东西。同样有在光线轨迹上创新的场景应该还有虫洞,只不过这里应该不仅仅是被引力拉弯这么简单,在跨越维度的膜时候谁知道光线朝哪个方向散射了,物理学家给推导了公式反正:

115450nk4km1mn21kntn1n.jpg
  宙这种场景的特效其实没那么麻烦:都是遥远的物体,光本来就少,没有复杂的场景全局光照也就不明显。上面说的那个黑洞弯曲光线的场景,估计也正是因为场景的特殊性,所以可以直接解析的求交:在三维空间中求一个数学上定义好了的曲线和一个球体还有圆环的焦点而已。解个方程就知道弯曲的光线打到什么地方了(谁把这公式告诉我说不定我一下午也能写个这种渲染器出来:p)。如果把这种弯曲光线的渲染器用来渲染非宇宙的场景,可能还麻烦一些,因为所有场景管理的数据结构(BVH,Kd树等)的遍历都是基于直线的。不过大概可以用许多条很短的直线去近似一条曲线吧。Anyway,纯个人yy一下。

1154502z3cqcccy15035m5.jpg
  星际穿越的确是需要有像Kip这样的黑洞物理学家提供理论上的帮助才能知道光线在那种质量和大小下的黑洞影响下是沿什么轨迹传播的吧。至于更多的物理细节,例如光带上的颜色具体该有多亮,光带运动的速度,轨迹,pattern,是否有流体力,磁场力的影响,就不清楚到底实现的多彻底了。我个人的直觉是很多还是hack的,因为许多因素对特效最终的视觉效果影响不大,而且不一定利于导演的storytelling。。。总之期待他们今年的siggraph论文了。

  在视觉特效行业,为某一个电影的某些需求要在现有的渲染软件上做改动肯定是有的,星际穿越算是一个很好也很特殊的例子了。

  最后声明一下,我不懂天体物理学,上面大部分内容算是我YY的。不过我也写了几年渲染器了,YY的应该略靠谱吧。。有错或者有漏的话就向大家请教了~

锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛