《
对马战鬼》开发商 Sucker Punch 首席视觉效果美术师 Matt Vainio 近日透过 PlayStation.Blog 官方部落格分享由开发团队精心打造的“对马岛”美景制作过程。Matt Vainio 提到,喜欢将自己的工作形容为用科技来解决美术与设计上的问题,也是他自《
恶名昭彰 2》开始就一直在 Sucker Punch 从事的工作。他表示,本作跟上一款充满了超能力的视觉特效游戏《
恶名昭彰:第二之子》截然不同,分享的内容将包含团队如何从炫丽的超能力过度转换成以鲜血、泥泞和刀剑交织而成既朴实却唯美的游戏,以及用来创造《
对马战鬼》视觉效果的方法。
在着手制作《
对马战鬼》时,我就先根据企划需求,找出几个需要改善的主要领域。首先。我想提高粒子系统的互动性。我们从《
恶名昭彰:第二之子》起就大手笔投资由表现驱动的粒子系统,创造出大量神奇的超能力。针对《
对马战鬼》,我的主要目标之一是沿用该系统,而将之导向高度互动性。我们从一开始就知道,“风”是我们必须融入整个粒子系统的重要元素。我们还想加入动物生命、利用环境氛围来营造史诗级美景,并透过角色在环境中穿梭战斗时沾附污泥与染血等动态变化,真真实实地确立“鲜血、泥泞与刀剑”的发展方向。我们有多种方式让粒子更具互动性,但这都需要从游戏世界获取更多资料。而我所说的这类资料包括但不限于:整体风、玩家从行动中产生的风、角色位移、地形和水位资讯、溼度等天气资讯、当日时间等等。
第二个主要目标是进行大规模建构。《
对马战鬼》的世界远比《
恶名昭彰:第二之子》大得多,而在 Sucker Punch 的“视觉效果”团队却只有两个人负责绝大多数的开发工作。因此我们必须尽可能透过自动化处理来更新内容,并且支援动态天气下随时间变换的大景。 最后,再以手动方式置入少量元素,协助引导玩家探索对马岛。
风
从最初就有的关键艺术指导目标是一切都要动起来。这是粒子明显能派上用场的领域,像是在空中加入飘浮的落叶和花粉,但其实还有许多系统共同运作,来营造出风吹的错觉。而除了粒子之外,还有树木、长草、衣服和绳索,也都会随风飘动。这一切的元素都要协调一致,好让整体配合不同的风况,呈现适当的摆动。我们将这整体风向纳入本作几乎每一个效果内;当炸弹爆炸或营火点燃时,冒出的烟雾会随正确的风向飘散。这也适用于火焰、火花等几乎所有元素。我们还对风速进行取样,以随着风速的提升增加气流。
我们原本并没有打算让整体风向系统成为导航模式,是《
对马战鬼》的艺术总监 Jason Connell 来问我和另一位首席工程师 Adrian Bentley,是否能让粒子作为任务指引,我们才决定这么做。于是“引路风”就此诞生。我们的作法并不是尝试建立不断变化方向以避开障碍的引路系统,而是直接对准目标,把寻路的工作交给玩家。主要是因为我们希望玩家能在找路过程中进行探索和思考,而非不假思索地遵循游戏使用接口来行进。这个指引路径作法所以能实现,全拜粒子系统能取得地形资讯之赐,使我们得以让粒子感知玩家周围的景观。
我最初尝试让粒子紧贴着地形,随着山丘低谷上下起舞。基于几个原因,这会造成一些问题。首先,我们的山峦有许多岩石模型来模拟悬崖面,而这些悬崖模型并非地形资讯的一部分,其下的动态镶嵌网格才是。这表示粒子会嵌入岩石表面并消失,使引路风难以辨识跟随。而粒子如此完美地紧贴地形,也显得有点不自然,因此我的下一个尝试是将地形设为地面,好让粒子在上坡时会被推上扬,而在地形下坡时平飘散去。我透过预先沿着粒子运动的路径执行数次测试,来增加遇到山丘时的上坡速率。在每次这样的测试中,粒子会观察它在该点上跟地形靠得多近,是否甚至可能被掩埋。假如粒子在这些前瞻点上过于靠近或会被掩埋,就会被赋予上坡速率。最后,引路风会视环境改变而有不同的元素:在田野里有蒲苇绒毛和长草,在森林里有叶子,在焚烧区有灰烬等等。我会在本文稍后再多谈谈该系统的运作方式。
以树叶来看,植物全都由布满节点的骨架构成,会随当场的风速而反应。我们跟程式编码与环境团队合作,针对树干与树枝创建各自独立的控件,让我们有更大弹性来打造对马岛上所需的多样化树木和灌木。除了较大的树干和树枝摆动,我们还叠加了会在叶子表面形成细微波动的噪声。
长草和蒲苇田是本作一个特别具有代表性的元素,需要渲染、环境与视觉效果团队之间的大量互通协作。田野是由草的程序生成三角形和蒲苇秆与簇毛的模拟素材混合构成。起初,我们尝试利用粒子,透过在重叠弧线上移动长草,来呈现波浪似的律动。这在草上的视觉效果固然很好,在树木或灌木上却看起来不对劲,再者,效益成本有些超出我们的负荷。在第二回的尝试中,我们添加了两层程序性强风到环境里。第一层是会随着风向卷动的大型噪声图案;最上层则是随地形卷动的纹理,可以在草上做出更细部的表现。这种做法的优势(除了改善成本控制以外)是我们能够将较粗糙的强风噪声也运用到树木和灌木上,让长草和其他树叶更完美相称。
后来我们确实有用到粒子长草位移技术,不过是用于在玩家和马匹走过时推动长草。这项技术以前就在其他游戏中使用过,而我们在本作的主要改良之一是透过粒子系统的运用来控制位移,这样就能利用各种表现,充分发挥更进阶的行为。其中一个行为就是借由在位移强度上套用阻尼波,让长草以拟真方式反弹,而不是以线性且不自然的形态弹回其静止位置。下方影片就是长草位移的实例,还有控制它的粒子系统除错检视(Debug View)。路径的绿色部分代表位移,而红色部分则是位移淡化的发生位置。仔细瞧瞧,你可以看到长草消失后随着路径离主角越来越远,位移值的恢复也越来越小。这会创造出自然的回荡波动,让长草感觉更为写实。
最后但同样重要的是,角色技术美术团队率先将动态衣服和绳索添加到游戏里,因为它们会经常用在角色身上。每个绳索和衣服模拟都使用与树叶和粒子相同的环境风输入资料,加强了仿佛真的有风横扫整个场景的错觉。
动物
我们很早就假定视觉效果团队创造的任何动物都只用于远观,但随着企划逐渐发展,才发现牠们其实可以发挥更大的作用。我们就这项功能跟撰写《
恶名昭彰:第二之子》粒子系统的原渲染程式设计师 Bill Rockenbeck 展开合作。他的第一步是让粒子生成全关节骨架的动画网格物件。一旦这部分开始正常运作,使用跟我们用于引路风的相同地形位置资讯,便可将模型的方向与地形相配,并在必要时与其冲撞。
我们加入了青蛙、鸟/鹤、鱼、蟹、虫等动物,牠们都会对仁和本作其他角色产生反应。透过在角色周围(包括仁)套用极低值风球,动物粒子效果就能察觉到何时有人靠近。我们使用新的条件事件系统,在条件成立时改变粒子运动,使动物会从人类身边逃散。这也套用在抛射物和冲击上,意谓著箭矢和刀剑也会吓走动物。
从下方影片可以看到初期散布在海滩上的反复交互式螃蟹效果。我们先从一些静态网格(这可能是我最精细的建模工作)着手,再重复其行为。我希望螃蟹能跟仁保持一点最基本的距离,以避免仁直接踩在牠们身上,同时让牠们呈现适当的惊吓敏感度。为了方便我为行为除错,影片中的螃蟹在移动时呈白色,静止时呈橘色。
叶子和对决
由于《
对马战鬼》的标志之一就是风,想当然我们会要加入大量的树叶,来让它们感觉既优雅又自然写实。这是何以在《
对马战鬼》的萤幕上随时都会有成千上万片叶子,随着风、环境和角色翩然起舞互动。
为了让树叶感觉真实得恰到好处,我们费了许多心力在让它们能视地形正确地落下。每片叶子都以盘状建模而成,并利用 3D 数学来使它在接触地面时,因应承受的力矩而产生适当的旋转。除了单纯地降落在地形上,我们还建模了一些其他的进阶行为:《
对马战鬼》里的叶子会落在水面上并随着水流漂流,也会从瀑布倾潟,在漂流的途中随着时间而逐渐沉没。
在《
对马战鬼》的开发工作接近尾声时,有位 QA 测试员告诉我他发现了一个奇怪的错误:掉进营火的叶子不会燃烧,而是落在火下的地面或火旁,静止而完好。我同意这样很怪,所以决定在营火里放置一个风发射器来解决这个问题,好让落下的叶子有所反应。这个向上的气流会让大多树叶不落入火中,是很好的细节。
“对决”从首次测试后就成为《
对马战鬼》深受喜爱的元素,而且从一开始,视觉效果团队就获得游戏总监授权,协助创造最能展现我们游戏内互动性和粒子系统的场景。
在许多场对决当中,我们创造出会持续对玩家和 AI 动作产生反应的树叶。就这部分,我们重新利用已建构好的长草位移技术,让粒子能够取样该资讯。借由这么做,我们就能够让叶子在角色疾行过时帅气地散开。对决的目标并非完美的写实,而是呈现移动的美感。我们采用与前述相同的活动系统来找出玩家位移值高出阀值的时间,然后建立一个下降率,让叶子在一小段时间后从起初的运动稳定下来,然后再次被推开。我们还运用了噪声图案暂时让树叶被吹过的风从地面扬起,以此来模拟强风和叶子不稳定的特质。
还有其他类型的对决也大量使用了别的动态粒子系统,如浮动的灯笼、会熄灭的蜡烛、会在你脚下散开的
浓雾、闪电等等。我们在灯笼上使用类似用于叶子的技术,每盏灯笼实际上都是一组会根据玩家位移而在水上移动和晃动的粒子。在第二场“龙三”对决中,针对动态蜡烛,我们将风发射器加到挥剑动作上,并在蜡烛上取样。假如风力超过阀值,我们会使用事件系统来熄灭烛火与烛光,同时产生新的一缕青烟和天花板烟雾效果。此外,玩家在滚动和闪避时也会产生风,因此与这些特别的对决蜡烛擦身而过时,也会把它们熄灭。
鲜血与泥泞
当角色奔驰、滚动、滑行和跌落地面,都会不断地把泥巴附着到他们的网格上。我们从艺术指导得到的早期目标,是要让角色像在真实世界一样会弄脏,以此作为游戏的基调。在动画过程中,我们加入不等量的泥巴“来源”到像是膝盖、手肘和肩膀上,让仁和其他人在决斗中看起来脏得恰到好处。假如你观察日本武士电影的著名决斗场面,就会看到《
对马战鬼》这里的灵感来源:角色踏入泥淖,并因跟地面的互动而溅得满身泥泞。
与泥淖如出一辙,我们所建立的鲜血来源也会在战斗中不断地加到角色网格上,显示他们的受伤状态。每一次的冲击都会在靠近剑击部位和周围加上血迹,这除了用在系统性战斗中,也会用于过场动画和剧情情节。
除了将血加到角色模型上,每次的攻击都会产生大量血滴与鲜血四溅的粒子效果。每滴血都会落在附近的几何体上,而在水中,它甚至会扩散成云烟状随着水流散去。
大规模建构
要做到大规模建构的关键环节,是让我们的视觉效果与环境相配一致,而不需要手动放置。以小团队之力,要去填满庞大的世界,我们很清楚必须建立某种程序性配置,因为环境生物群落的变化非常频繁。我们并不想穷尽所有时间仅仅在维护内容上,它必须能够自行修正才行。
成长与生物群落
这有一个简单的实例:我们希望粒子树叶只落在林区,而不落在草原上。第一个尝试的作法非常猛:我们配置了一种效果在程序性生长于岛上的树木。此举很快就失败了,因为小空间里的环境同时存在着数百棵树,这对几何结构来说固然不错,但是对粒子系统却代价高昂。透过将粒子设定成只在非常靠近树木时(约 50 呎)才出现,让我们取得了一点小小的成果,但是在视距拉远时,这又感觉像是个败点。采用这个作法的另一个问题是,当我们在玩家骑马呼啸而过时,从 40 呎高的树冠上投落一片叶子,它甚至还来不及在玩家穿越过树木之前落入他们的视线,因此经常看不到叶子。
我们的第二个作法是采用如环境所使用的相同成长系统,透过套用相同的遮罩和算式,程序性地将粒子系统和树木配置于相同空间里。这个作法需要我们将交叠的叶子圆形置于时或复杂的遮罩形状内。这些圆形会从遮罩规则的边界在其半径距离内受到推挤,这代表因为成长规则和算式而没有叶子的地方,就常会出现大空隙。我们可以透过建立更多更小的发射器来平衡这一点,却会牺牲性能表现。再者,要修正特定区域也有其困难度,因为假如我们为了要修正关注区域的密度或漏洞而改变成长规则,就常会破坏了其他原本运作良好的森林群落。话虽如此,该技术大致上行得通,即使还有一些瑕疵,也大抵成功了。
《对马战鬼》Map FX
图 1 的萤幕撷图展示的是使用我们的成长工具,根据决定树木位置的规则来添加粒子。由于可见空隙较多,最终没有继续保留的价值。图 2,我增加了大幅成长的粒子发射器数量。这几乎可行,却占用了我们可用于其他地方的宝贵性能。图 3 显示的是我们的第三种作法:生物群落图。我们的其中一名渲染程式设计师着手为灯光团队开发一项功能,其使用资料将来自环境成长遮罩,并可即时取得。我询问是否能够借助这项技术,且幸运地获得了肯定的答复。这让我们的粒子系统得以知道任何特定粒子被建立在什么生物群落之中。图 4 是一个除错粒子系统,显示出粒子读取该资料的方式。蓝色区域是草原,而绿色区域则是森林。
初步推移略显块状不自然,但当我使用噪声图案来修改取样的资讯后,外形就变得更有机自然而实用。这跟其他诸如取样地形位置、素材和风向等功能结合时,就成了我们新环境氛围系统的核心。在任何一般的定位中,我们都能够从环境移除数百个已成长的粒子系统,并以会追踪镜头且对环境生物群落更为精确的单一系统取而代之。
尽管我们已将大量效果从成长系统转移到即时生物群落系统,我们仍然在《
对马战鬼》里针对某些粒子效果使用了成长系统。一些实例包括栖息于林边的飞鸟、海滩区的螃蟹和海鸥、水稻田区的鹭鸶以及沼泽的鹤。最后,我们还利用成长系统来添加森林边的
浓雾。在所有这些例子里,每当环境团队改变了森林、田野和海滩的位置,视觉效果就会自动跟进。
美景和导航提示
在《
对马战鬼》里,美景之于协助玩家找到目标的游戏玩法,和发挥设定基调与艺术指导的作用,具有同等的重要性。我们觉得应该尽可能地让寻找任务成为一件自然发生的事,因此我们创造了各种可用来暗示任务位置和挑战内容的效果。一些实例包括执行任务或挑战内容时遇到的各种烟雾、提示俳句机会的鸟、从温泉田冉冉上升的蒸汽等等。
合而为一
《
对马战鬼》的视觉效果是环境不可或缺的一部分,每个取景都包含了许多独立的系统共同合作,才由此强化了游戏的动态外观。从前景的生物群落和动物元素,到背景的天气和内容标记,都因有视觉效果的支援才得以将生命气息注入游戏世界里,使得探索对马成为一种享受。
感谢大家拨冗阅读,希望在对马的视觉效果加持下,让各位的冒险之旅充满乐趣。如果还好奇想知道更多关于我们的深层技术,欢迎观看我在 2014 年游戏开发人员大会上的分享,其重点就在我们由表现驱动的粒子系统。