显然,游戏并不是魔术,但是如果你不知道游戏在表象背后的运行原理,可能它们看起来就像是变魔术。最近有一张非常火的动图,展示了《地平线:黎明时分》的游戏引擎是如何渲染场景的,(小编注:游戏使用的Decima引擎也将是小岛秀夫的《死亡搁浅》将要使用的引擎),从这张动图中,我们看出游戏在运行中其实只渲染玩家视野所见的场景。
对于很多人而言,这样的动态场景在初次看到时可能感到非常震撼。奇怪的是,相对于普通玩家对这种技术的兴趣,很多开发者似乎已对这种技术见怪不怪了。所以我们在这里为大家补充一些这方面非常有意思的“黑科技”知识,看这些技术是如何让游戏中的世界看起来非常绝妙的。
就让我们从开始的那张《地平线:黎明时分》魔术般的渲染图开始吧。
Culling(剔除)
Culling(剔除)也就是削减,在游戏中其作用就是通过只渲染玩家看到的场景来减少游戏引擎的工作量。目前还没有一台PC或是主机可以一次性渲染《地平线:黎明时分》中的所有场景,所以这项技术就通过不再渲染游戏中玩家视角之外的大部分场景,来减少游戏机的工作量。Culling主要有两种类型:Frustum Culling(椎体剔除),即渲染视角中的所有场景;Occlusion Culling(遮挡剔除),则只渲染镜头内视角中可以直接看到的场景(被视角内物体遮挡的物体不渲染,更多的减少了机器的工作量)
下面的动图就展示了两种渲染的不同原理:
Level of Detail(细节层次)
另外一项游戏可以节省宝贵运行资源的原理是,只展示近处场景物体的细节。这种技术会在玩家接近物体过程中,逐步提升相应物体的细节表现层次。看看下面这些细节层次不同的3D渲染的兔子吧:
显然第一个是细节层次最为丰富的,最后一个则完全就像一个折纸。然而看看在一定距离下,以上这些物体呈现的样子吧:
其实这样看的话,最后一只兔子的效果可能给人在视觉上的感觉并没有那么差。这项技术和上面的Culling(剔除)类似,也是为了节省玩家游戏机的机能,以便更加有效的利用。
但是细节层次的处理也是非常讲究的,开发者需要尽量让玩家感觉不到这种细节层次的加强,但即使是大作,也会有一些时候在这方面没做好优化。
《巫师3》在细节层次渲染上的失误(远处的帆船突然出现,有些违和):
Rays(射线)
Rays(射线)或是“Ray Casting(光线投射)”是游戏计算其场景中物体所在位置的重要方式。如果你之前听说过《美国末日》中的”Punch lasers“,其实那就是Rays(射线)。这项技术的名字也就解释了其原理:一个物体发射出射线(在一定的方向发射出很多射线)如果这些射线碰到任何物体,它们则会给出反馈。
下面就是Jacob Minkoff,之前《美国末日》的首席设计师,解释的当乔尔在战斗时,这种射线技术的工作原理:“当你按下拳击键的时候,乔尔的拳头在游戏世界的周围发射出一束射线,同时发出这信号‘附近有什么?’。哦,这附近有一堵墙。或是附近有一张桌子。所以如果你按下拳击键产生互动,游戏就会让乔尔打到一面墙上(或桌子上)。
另外一个《美国末日》中关于射线原理运用的例子是,游戏如何利用射线原理来确认艾莉相对于乔尔所在的位置。
上图中展示了从乔尔身上发出的射线是怎样确认艾莉的潜在位置的。 其他的射线则回应其他的问题,如某个点是否被一个物体挡住了,艾莉是否能看到前面,是否能看到乔尔等等。当游戏中的人物穿墙时,说明射线程序出现了问题,没有给出正确的反馈。
延迟渲染(Deferred Rendering)
在这里,我们确实不想对相关的技术做深入的解释,对这个概念,我们简单地介绍一些皮毛,因为这里面有太多的变量和选项。这项技术的主要内容就是,你在屏幕上看到的东西并不是一步渲染完成的。游戏并不是拍摄一个虚拟世界并直接呈现在玩家的眼前,而是通过平面分层的形式,分不同的特征和细节依次呈现出来。
下面这张GIF图片就展示了《杀戮地带2》是如何依次分层渲染一个场景的,每一个层都计算和处理不同的元素。打个比方就是,每层依次渲染了光效、阴影、色彩、材质等内容,以此创造出一张游戏正在模仿的平面2D图。
这就是后续处理事项的顺序,就像这项技术名字所表示的那样,一些效果是在基本的游戏场景渲染完之后才进一步渲染到游戏中的,例如游戏中的动态模糊效果和场景中细微的粒子效果。这些都是在游戏各种着色器和光影效果完成之后,才进一步完整逼真地呈现出来的。
着色器(Shaders)
着色器的种类非常多,我们为了简单起见就只介绍顶点着色器(vertex shaders)和像素着色器(pixel shaders),展示这些东西可以处理的两种主要效果——改变游戏中的光影效果或是像素位置。像素映射(Pixel mapping)一般会影响色彩和光效,同时也可以在光效下影响表面像素的位置。看下面这张图:
图中展示了一个平滑的球、一个凹凸贴图(一般的材质都是黑白相间的)以及两者整合到一起后就可以做出的一个很像橘子的物体。
以上的是一个比较简单的版本。下面就看一下在《教团:1886》中着色器是如何运作的吧。
以上的每个小球展示了最终添加到水泵上的纹理图。着色器就是一种不需要消耗大量游戏运行资源而可以为简单的模型增加精美细节的工具。游戏中的这个水泵是一个复杂的几何体,其上面的每一点都需要计算,而着利用色器贴在上面就可以做出一个精细模型。
下面这里则是另外一个展示了法线贴图(normal mapping)
上图中右边的细节较为丰富的通过法线贴图完成的模型,没有使用任何多边形,它仍然是左边的那个模型,只是使用视觉特效,制作了一个仅需要少量运行资源但看起来很复杂的模型。在这方面,如果你曾经在游戏中见过一些看起来单调、模糊的物体,那可能就是着色器失效了。
另外一种重要的着色器叫做定点着色器(vertex shader)。这些着色器更加专注于游戏中物理运动像素的渲染。如果你在游戏中见过水体,你可能就见过这种着色器的实际运行了。渲染平整的水面然后再用这种着色器让水体动起来比单纯的模仿水体运动要简单许多。
但是这种着色器也不仅仅应用在水面的渲染上,下面就是一个非常好的例子,展示了顽皮狗的开发者使用这种着色器在《神秘海域4》中模仿了密集植被的动作。
《神秘海域4》定点着色器(vertex shader)技术演示
虽然在技术上去制作每一株植物的动作是可以的,但如果那样的话,会在运算植被的碰撞和计算它们之间的反应、移动方向等方面消耗大量的资源。然而一个着色器把所有的变形应用到所有植被的像素上,就可以创造出相同的但是又不需消耗大量资源的效果。
以上仅仅的内容也仅仅是介绍了游戏运行背后的一小部分机制,许多3A级的大作背后,其实还隐藏了很多更加复杂的运行机制。就像一束光反射出的物体,从物体源到你的眼睛所需要的计算比你在考试中经历的要多得多那样,游戏也需要在你突然移动视角时,在每个物体、每条光线以及物理运动、剔除、射线、细节层次等方面做相应的计算。
当游戏帧数降低或是玩家在游戏中穿墙了,那可能是游戏中突然进行了大量的计算以至于出现了小差错。同时当你开始探究游戏中这些东西是如何整合到一起的时候,你必将会惊讶于游戏的运行原理。
注:以上文中涉及到了大量游戏开发中的专业术语,由于小编能力有限,难免贻笑大方,不当之处还请谅解或不吝指教。(原文链接)