GDC2014:声名狼藉:次子的视觉特效技术

发表于2016-08-31
评论1 6.1k浏览

原文:GDC2014 The Visual Effects of inFAMOUSE: Second Son

翻译 TraceYang  校对 钱康来

 

首先这段视频是关于官方对于特效制作3分钟短片

 

讲解开始后,演讲人播放了声名狼藉:次子的特效展示视频

视频01

 

Enjoyyou power,是声名狼藉:次子最大的商业宣传语,这也运用到了视觉特效组的游戏开发中,希望我们制作过程中试图表现的乐趣能被大家感受到。

 

演讲者是 Sucker Punch工作室的特效美术师。而这次要讨论的内容,首先是如何次子中创建视觉特效的,因为没有足够时间可以讲解创作的所有的能力特效,所以这里集中讨论烟气(Smoke)和霓虹(Neon)这两个能力特效。然后是关于次子中创建的新的工具集和管线的讲解。除此之外还有新工作流的一些优缺点,以及在次世代硬件上尝试创建新内容的经验教训。

 

接下来就正式开始,讲解下是如何创建Smoke Power(烟气能力)的。

 

首先要讨论的是如何去定义烟雾能力的视觉语言,以及这个能力后面的游戏设定。这里将会讲解烟气冲刺(Smoke Dash)和烟气通风管传送(Smoke Vent Travel),演示它们是如何从概念设计到最后完成的。

 

 

下面的图是烟气弹(Smoke Bol)能力的早期概念设计,在试制阶段,工程师们在试验的过程中创作了特效工具集,在内部工具之外也使用第三方的软件来做尝试来获取一些想要获得的感觉。概念设计组在这个阶段努力去创作烟气能力的概念,来实现各种目的的能力设计。在这个阶段,想法上并没有任何被限制,这对美术来讲是非常有好处的。只需要考虑最终的产品而不会被技术约束是很重要的。

 

下面是一些处于是闲置的动画状态的烟气环境的外观示例。

 

下图是在制作烟气大招Orbital Drop时制作的。而受到最后冲击波影响的车辆会冲击到后面的车辆和地面上。在这个概念阶段的时候,实际上收缩了外观,这样就可以看到这个烟气能力的3个常用元素。分成了Wispy SmokeBillowing Smoke(翻滚的烟),以及Ash(烟灰部分)。

 

这样就有了创建烟气能力的任务。有多了一些主要的障碍。最初的艺术指导主要是让它看起来更加像真实的烟,或者是一些电影里效果。烟气本身并不会感觉到有多危险,因为并没有对烟的重量,冲击力以及冲力上的本质认识。就像是作用到真实物体上就像大气一样效果不明显。而且烟在低光照的环境下也很难看到,这样会影响玩家对位置的判断。所以分析了真实的烟气后得到了一些评价。首先是风中的湍流(Turbulence)对于达到的需要烟气视觉特效是非常重要的,第2点就是粒子系统的光照在场景里要正确,而且要和场景融合,不能像是直接拼接的,这两方面都是极为重要且附有挑战的。如果满足了核心要求,烟气在声名狼藉的世界中就变得更可信了。开发的能力要突显出风格化的特点,比起完全真实,特效在游戏世界中的可信度要更加重要。

 

下面的视频是在项目早期,花了一些时间在第三方工具例如MaxHoudini里做的试验,可以帮助你在使用内部工具制作时获的灵感。这是用Houdini做的一个小例子,加入了大量的TurbulenceWind的模拟,可以看到在引起中通过实时的调用噪声函数,特效在方向上受到了影响。这样可以拿去给程序,然后他可以拿回去作为指导,来制作实时控制的噪声。视频后段是最后运用到游戏里的能力烟气弹(Smoke Bolt)的效果。

译注:因为GDC上的录像的画面质量比较低,所以这次所视频演示部分截取的是演讲者后来在youtube上的20分钟视频讲解,虽然是同一个PPT视频内容一样,但解说多少有些差别。



 

在分析了作为参考的概念艺术和初期制作的特效原型后,我们意识到要制作烟气那样的危险性,需要烟气元素的轨迹,也就是力量的剩余残留物。还有要保证能力在一天不同的时间段(Time of Day)的可见性。最后的方法就是产生出很热很亮的灰烬的风暴。就像有人在你面前抽烟只是很讨厌的,但如果是用你脸来熄灭香烟就很痛苦了。虽然也知道这会产生玩家把能力和火焰混淆的问题,但是更重要的是,玩家可以在设计的角度来追逐和了解他的能力。  

 

 

声名狼藉中制作游戏感的游戏元素之一,就是穿越感(Traversal)的享受。烟气冲刺(Smoke Dash)是第一个能力原型。概念设计组提供了4种不同的外观,从中选取了各种的构思来制作最后的能力效果。

 

烟气冲刺的核心概念设计中,主角会非物质化并且穿越类似链状栅栏的物体,或是绕过矮壁或骑车。为了可以将主角非物质化,需要创建转换特效来掩盖附加的主角三角网格的移动。这里要在主角的网格表面发射粒子,并使用称作粒子网格(Particle mesh)的低LOD的分辨率主角网格。在行动上也要像真的烟一样平滑流动,另外一个重要效果是在移动开始的生成粒子与结束后重组的是同一个粒子,这样每个粒子系统就有连续的运动。其他元素的处理还增加了Ribbion(条带)的烟气光照来帮助表现主角运动的方向性。

 

下面就是烟气冲刺的概念

 

下面的视频里把烟气冲刺的特效进行分解不同的组件,有Smoke RibbonsSoft SmokeAsh&Ember,以及Dynamic Light


   

下图左边的是不带网格发射器的的基本的主角几何体,而右边是隐藏了主角的几何体,并且打开了粒子发射器,而发射器的Parent就是前面提到的粒子网格。它们继承了网格的颜色,法线也是和Parent三角形是同样的朝向,通过这个技术,可以将主角几何体被关闭与网格发射器打开之间的转换隐藏掉。

 

在下面的视频里更接近的看下这个技术。这里用了1/5的速度,让效果更加明显。可以看到冲刺结束的时候,主角网格被替换了回来。如果是实时的观看并不明显。


视频04

 

 

这里在后面加入了灰烬粒子并和主角分离了一段时间,粒子沿着某种噪声来移动,最后在重组的时候返回到主角的位置。然后是关闭了噪声,可以注意到网格上的灰烬粒子被解锁在游戏世界中自由移动,然后再返回到网格。这里头部网格生成的粒子返回的速度,要比接近脚步的粒子快。给予了冲刺的感觉。


视频05

 

 

下面的图表显示的是通过世界更新和主角的网格来实现位置的插值,图表中粒子的值为0在底部时,粒子被从它的网格上解锁,为1时则是被锁定在网格上,这图显示了归一化生命周期里粒子的位置。可以看到图表是如何从1开始到0再回到1的。左边图表A表现的是从头顶生成的粒子,右边的图表B是是从脚底下生成的。要注意的是身体上粒子系统的位置取决于它的高度,然后在AB两条曲线之间插值。

 

下面的视频中,使用烟气冲刺,烟气让主角变平,然后向最后的目标向前移动,以助于传递运动的方向。然后显示的是实际的Parent-child(父子关系)的发射器,用来生成条带(Ribbon)。可以看到黄色条带从前到后都是同样的朝向,移动的时候会产生很多的黄色ribbon,蓝线是主角移动的方向,白色的是条带在3维空间的朝向。条带的朝向向量是由Parent和主角移动的方向来决定的,再与相机视口向量叉乘来得到。这只是一种简单的条带朝向的例子。可以调整条带的限制向量,使得其朝向的我们想要的方向,这个技术一些游戏实例中使用了,例如主角的烟气漂浮(Smoke Float)和烟气弹(Smoke Missile)能力中,使用这种方法做的调整。


视频06

 

下面视频是最终的烟气冲刺效果, 在空中划过或像烟一样穿过栅栏。烟的一切都很平滑。


视频07

 

 

烟气冲刺能力的升级就是用通风口传送(Vent Travel)到建筑的房顶,然后降下。下图就是烟气通风口传送的概念设计。

 

这个效果的目标是可以重用烟气冲刺的非物质化主角,并用旋转的烟柱把主角送到天上。视觉效果非常依赖烟雾条带效果。重要的是要捕捉开始时的爆发力和结束时的减速来来对应动画组的制作。同时希望在烟气在下落可以感觉风力的影响。

 

主要是这个能力非常的接近概念设计。

 

下面的视频是传送的最终效果。还是由3个元素组成,Smoke ribbonSoftSmokeAsh&Embers


视频08 

 

那么,第一步是在概念设计上规划出形状,创建环绕主角的火的路径,因为可以通过设置粒子发射器的父子关系,来从其他粒子的位置来生成粒子,所以可以利用系统来生成这种形状。这里使用了和烟气冲刺的条带类似的技术,通过合并父子发射器来制作。

 

在下面的视频里,可以看到红色的父粒子(parent)向上移动,而且它们附带了子粒子(child),可以看到不同值的缘故,半径也是不同的,这些值由关键帧来控制,可以看到图表左侧的值比较低,并将其保存为profile,当父粒子在生命周期增加了旋转,可以看到开始形成基本概念设计里的形状了。要让条带的感觉更加有机,要在条带的路径上加入噪声,可以在视频里看到条带变得厚和细,通过了1D的噪声,后面要讲到的几种弯曲噪声的函数,可以用来让获得更多粒子运动。接下来是关闭了条带的旋转,让噪声模版的效果更加明显。并划分出不同的方式来让烟气更加有机化。 还有就是给发射器增加旋转噪声和风力,这里使用了一组不同的octave的噪声到条带上来制作。通过Pattern生成了大波和小波,得到了很好的有机效果。Pattern是一直在迭代的,所以可以使得每次火焰效果不一样。


视频09

 

接下来讲下有大量运动的烟气的翻滚效果。实际上这个烟雾喷发的动画是向下的,当烟气翻滚时,烟的Billboard是向上移动的,这样看起来烟就是在滚动的,这边工程师的解决办法是放大粒子的UVUV在中心的速度要比在边缘的速度更快,这样的UV就是球形的效果,让Billboard更有体积感。视频里只有一个Billboard,可以看到调整UV大小值后,球的形体变得更加的明显,这样一个简单方法就可以获得许多烟气纹理的运动效果,而不需要再使用Flipbook flow map或者 uv dispalcement。整个游戏应该只有两个有动画Flipbook。这个技术就是如此简单。


视频10

 

视频就是最终的通风口传送特效,很方便到达屋顶,只需要使用烟气冲刺就能到达顶层的通风口再落下。可以很有趣的改变在城市中的位置,而且看起来也是很有条理的。


 

前面讲完烟气能力后,接下来看下霓虹能力是如何创建的。

 

关于霓虹能力,还是要回到视觉语言的定义上,一个是从广告牌上吸收氖气(Sign Drain),另外就是霓虹冲刺(Neon Dash)是如何实现的。

 

下图是概念设计组的霓虹对近战攻击的视觉语言的研究,这个构思来源于拍照时快门时间开的很长,然后用荧光棒画图案后,最后照片里有亮的轨迹。

 

下面的shockwave爆炸的概念设计,可以看到在尝试找到这种能力的视觉特征,在角度和流动线路上做了测试,例如线的对称性和不同的颜色构思。

 

正如你所见的,light writing上在概念设计上是复杂的延迟形状。所有的效果都要能投射光照,要有一些体积感,增加light writing体积感来给予一些深度。增加了显示在背景上逐渐消失的霓虹气体,这样的目的是增强霓虹看起来像等离子体。还使用曲线噪声来方便的加入波形式样(waveform pattern),为了能获得和烟气不同的效果,使用了更大的waveformpattern,以及较小的噪声octave来获得更加流动的形状。同样可以对noise pattern进行clamp,在一切情况下要创建出受控的霓虹效果,例如聚光在一个圆筒里,那么噪声就要被限制在圆筒内。这点是非常重要的,让人觉得霓虹能力是被控制的,而不像烟气那样。这也是作出和烟气不一样效果的方法。

 

在能力开发中,也和概念设计组进行了很多反复的讨论,在工具中进行开发前的预制阶段,制作了很多烟气能力的概念设计,所以当在对霓虹能力的视觉语言做定义时,把工作流提供给了概念设计师,就有了更加广义形式上研究,而不是去细化插图。下图就是对Neon float(霓虹漂浮)的研究,

 

游戏最终的漂浮效果就和概念设计很接近了,是在不同的设计上获得的灵感。

 

下图是霓虹的停滞手榴弹(Stasis Grenade)的研究,这个是特效组在开发时的一大挑战,概念设计师主要是来掌控形状来提供给特效制作使用,所以他们这需要了解特效所需的时机,这就要描绘出形状在整个生命周期的迭代。图中左下就是个简单的示例,例如从AB的变化就比一张静止的形状更加有帮助,能让特效了解特效的起始和结束和中间过程是一样重要的。很多情况下你要求概念设计,通常只会给你特效的中间阶段。

 

然后讨论下氖气汲取(Neon drain),这个是第一个开发的霓虹能力,要正确的来作出是一个挑战,但这可以来帮助制作剩下的霓虹能力。设计目标是可以从游戏中的霓虹灯广告牌模型上吸取氖气。首先要弄清楚如何去做,在广告牌上用样条曲线来建模,再将Billboard渲染到这些样条曲线上,从电子管上吸取时,粒子沿着这些曲线被吸出来。这里也使用之前烟气冲刺的粒子网格的技术,并修改它来对应这种特定的能力。这个特效基本上就是当按下吸取键时,从附加在游戏中广告牌模型的粒子网格上生成粒子,然后关掉广告牌的自放光值来关闭所有的霓虹电子管以及它的光照和反射。最后在旋转向下朝向主角手来运动的特效,就可以抓住并吸收能量了。

 

下图是早期霓虹能量吸收的概念设计。

 

视频中氖气被从广告牌中吸收了。


 

下面是另外一个从草图概念经过很长步骤到达最终产品的示例。这个效果是次子的美术指导做的。最终结果与草图的概念是非常接近的。我很喜欢这个效果,特别是最后的几帧。

 

 完整版本的霓虹吸取,实际上也是由不同元素组成的,这里分开显示有Wispy EnergyNeon BitPlasma Gas,以及Dynamic light


 

下图是霓虹灯广告牌的粒子网格的示例,粒子的生成是不变的,但在网格三角形上位置会随机变化。粒子生成后并不会被绘制,会采样底部的颜色,并被限制在一定的阈值内,粒子会找到一个新的位置,在放弃并摧毁粒子前这个步骤会重复10次,这样特效粒子就只会在自发光纹理有值的地方生成。但这并不是意味着生成的粒子就会很少,有时会采样黑色的区域而得不到有效位置,但得益于PS4的机能,可以生成1万个以上的粒子,所以也没什么问题。

 

可以更清晰的看到粒子从自发光shader上的颜色继承,红色粒子来源于广告盘的红色部分,红色粒子来自红色部分,绿色的粒子来自绿色部分,然后换成了简单的形状和Biilboard让读者看的更清楚。


 

在示例中,把Billboard与粒子网格的法线重设了下,在视频里更加明显。所有的绿点是同一个粒子网格生成的光源的实际位置,被转化成了和底部像素同样的颜色。通过这些光源,就可以使用较少的粒子数量。剩余粒子可以有更好的性能,视觉表现上也不错。使用比较大的衰减的光源可以得到聚集的光照,还有很多小的点光源。

 

下面的视频是预告片中使用的霓虹吸取的效果。演讲人很喜欢这个效果。


 

霓虹冲刺(Neon Dash)是另外的一个障碍,不光是这种移动能力在声名狼藉的世界观中很重要,也是如何处理主角在light-writing元素中移动的尝试。这个能力除了男主角使用外,也被另外一个主角费曲"fetch)使用。游戏设计需要很长的拖尾可以让主角跟随上,其他的设计需求是一旦玩家按住冲刺键后就不会被阻挡,这会有一些技术上的限制,比如有效冲刺距离的描述。这样就无法使用烟气冲刺中那种,主角可以用发动过程中遗留的相同粒子来进行重组的技术,因为在结束前并不清楚冲刺的时间。

 

下图是霓虹冲刺的早期概念设计,在方向的起始点上,需要主角的形状闪动(form strobe),并且遗留在拖尾上。同时也要确认闪烁元素的特效从冲刺后面产生出来。已经确定如何生成后,使用(Energy over surface of the mesh)技术来制作结束效果。这个会在后面讲解。


 

下面视频是霓虹冲刺的完整版本,主要的元素组成部分有,Wispy Energy,基于样条线生成的Body RibbonNeon BitsPlasma Gas,以及一些Light。而跑到屏幕外面也有拖尾,而且持续时间很长,有20-25秒。

 

把条带独立出来显示的效果,创作出了霓虹冲刺的外形,可以看到跑动周围的闪烁表现。接下里是不同样条位置的显示,是通过提供的主角的关节点的列表创建的。对每条腿各生成1个样条,躯干生成1个样条,头也生成1个。围绕样条旋转曲线,形成一种围绕的柱状效果。而条带也是基于样条来创建的,通过曲线噪声(Curl Noise)稍微调整了位置。


视频17

 

在霓虹能力上使用了的元素还有网格上残留的能量(Lingering Energy),在深度缓冲上进行的相交测试,这部分的细节演讲者也不是很清楚,是软件工程师搞定的,接下来的Billboard是朝向屏幕的,当移动时可以注意到Pattern,指定Billboard的朝向,可以获得更加一致的Pattern。可以看到调整不同的深度测试,可以得到各种的Glow的总量。这个特性在所有的能力都有使用,例如停滞手榴弹。可以得到有特征的能力设置。


视频18

 

下面的视频是霓虹冲刺的最终结果,在单轨轨道上冲刺是很有趣的,并且可以冲刺到任何位置。也把这个能力叫做“time thief”,因为你稍不注意就已经游戏里玩了至少15分钟了,很容易消磨时间。


视频19

 

所以为了可以作出这些展示的特效,需要为次子制作全新的工具集。(工具组件这部分的讲解是在另外一个讲座里,是引擎工程师对粒子系统架构的讲解,有更多特效系统的技术点。有兴趣的读者可以自己去看或等后面有空再翻译)。

 

在次子开始预制的时候,有一些已知需求被确定要在工具集里实现的,不得不去实现这些游戏设计需要的功能,通过灵活的系统,可以处理各种类型的能力。作为付费扩展,也希望特效可以用在故事的其他角色里,目标就是让任何事物都是活动着的,具体来说就是角色的能力不是完全固定的,有一定随机性.。这点是非常重要的目标。在产品方面,特效组希望可以更快速的来编辑,这也是非常必要的,因为要在很短的开发周期里完成大量工作,基本上只有2年时间,而且还有一些变化的产品周期。有新的引擎,新的硬件。要确定什么是次世代是很难的,最初的目标是增加模拟的复杂度,并合并进更加准确的光照以及排序。通过这两项改进,可以感觉是一个好的开始。

 

为了完成这些挑战,在需要什么类型的工具,渲染技术和处理上做决策。在游戏设定上有很多的能力设定,这也要求有非常灵活和强力的系统,意味着要对传统的粒子模拟重新考虑。例如大部分的粒子编辑环境中,粒子基本上都是发射后就不用管了,在粒子的生命周期中,位置是基于的参数可以在持续时间中设置的只有速度和重力这些。而在次子中,可以直接设置粒子在任意生命周期中的位置,或者通过用户参数来驱动。基于表达式的系统要面对的设计挑战来确定正确的选择。改善着色,允许粒子实时编辑,并且在GPU上运行粒子,也是在开发早期制定的关键决策。

 

下图就是粒子编辑器的基本布局。左侧的大纲窗口(Outliner)包含了所有的粒子系统(Particle system)和发射器(Emitter),属性编辑器(Property Editor)里是所有表达式中可以编辑的变量,属性字段可以是图表数据的值,例如右边关键帧编辑(Keyframe Editor)中的数据。

 

粒子的表达式就像前面提到的一样,有很宽泛的输入类型,例如向量,浮点数,字符串,随机范围等等,把这些静态值编译成PSLPlayStation Shading Language)的常量(constant),一旦编译完成这些值就可以动态的编译,即便是在游戏时钟暂停了,这些变量可以通过系统或中间层创建,称作用户参数,可以在表达式语法中使用,还有就是三角化的算法只有那几种常见的,但是变体很多。

 

不光是发射器功能,还加入一些灵活性到emit iteration multiplier里,可以通过用户参数来修改发射频率。工具也支持发射器和更新空间的设置,这样就可以让角色的发射器继续跟随关节来更新,或者遗留在世界空间里。也可以在不同的空间中转化和插值,就像之前在烟气冲刺中展示的那样。

 

下面的视频是在编辑器中编辑粒子系统的示例,可以图像方式编辑曲线,增大或减小粒子改变烟气的比例,可以注意到在游戏时钟暂停的情况下也能改变这些值,也可以改变前面提到的constant的值,表达式也可以实时的改变,因为这里改变了Billboard的大小,所有的constant值都可以改变,例如alpha / brightness,任何值都可以在运行中期来求出,因为可以实时的改变值,所以能在随机范围上乘上一个值,调整曲线,改变很大。


视频20

 

表达式系统的一个优点就是可以用户设置参数,参数有两类,分别是系统级的参数和发射器级别的参数,系统级参数的处理范围是整个系统,可以被任意发射器引用,并返回相同的值,这些参数可以通过脚本语言或代码在外部改变。同样也可以在实例(Instance)层次来上改变,就是某些特定的emitter的值不一样,譬如颜色的比例。发射器级别的参数只是处理反射器范围的,来求出不同粒子的值,例如发射器上有随机范围的参数来进行缩放,能让每个生成的粒子返回不同的随机值。

 

关键帧编辑器提供了很强的功能,可以以x轴输入的任意公式,而这个简单的曲线可以为粒子使用,在底部可以输入公式,图片里是个“L”,这是个缩写代表着粒子的寿命,会返回01的值作为粒子的寿命。

 

所以可以映射的输入表达式到关键帧,例如通过粒子的位置来做颜色插值,下图中创建了变量和box,高度5米,宽度和深度0.5米,输入表达式来创建关键帧。根据Z输入一个函数,输入的范围是5-500,输出0-1,参照了粒子的高度输入到颜色函数里。也是把输入表达式可视化的方法。

 

下面的视频是更复杂的使用关键帧的示例,对调整粒子的旋转速度非常的方便友好,如果把圆盘的半径作为输入变量的话,用关键帧来控制输出,这些值会改变旋转速度,通过比例来变快或变慢,这里使用关键帧也来控制颜色插值让结果更加明显。这个只是一个使用了几个表达式的粒子系统,可以通过把各种行为分层与堆积,就可以作出非常棒的效果了。


视频21

 

在讲完编辑环境后,现在要讨论的是粒子系统的着色和光照,这部分也是花了一些功夫来实现的。

 

粒子系统在次子中的目标是可以流畅的适应环境,强烈感受到要让真实的感觉粒子是加入到场景里的,那种不正确的光照和着色,也就是前面提到的合成感,不能感觉是直接合成进去的。所以就把问题分解成了下面这些觉得要实现的组件,需要能粒子能投射和接受阴影,投射光源,反弹环境光,接收方向的太阳光,正确的跟雾混合,以及与环境使用一样HDR的粒子渲染。

 

对于阴影方面,需要有助于感受环境的接地感,工程师可以创建阴影缓冲,每个粒子都有个简单的Blob阴影,再加入到整体的阴影形状里,这个特性会在后面演示。

 

下面的视频中是粒子系统投射阴影,而且可以调整阴影的强度,阴影调整主要是基于材质会包含的光照有多强,是美术方面的调整。那么例如降低了阴影强度,例如降低水蒸气的阴影强度或者是不透明的云的阴影,需要一些人工的调整。


视频22

 

下面的视频是粒子系统接收环境中树的阴影的示例。阴影的分辨率是根据与投射阴影物体的距离而变化的,不过结果对于移动的太阳光来说还是比较不错的。因为所有的几何体都是延迟渲染的,所以不论是静态物体还是动态物体,都可以向粒子系统投射阴影。角色在空间中飞过也可以投影阴影到其他粒子系统上。


视频23

 

要投影阴影,也需要在粒子周围投射光源到环境中,来帮助它适应场景环境。也有助于增加游戏体验,让粒子在3D空间中的移动更容易被跟踪。粒子光源同样有类似粒子系统的表达式。可以影响所有的几何体,包括延迟渲染处理的粒子,但是不能影响透明的粒子,或则是其他非延迟渲染的粒子。在开发初期问软件工程师能不能都有光照,像这样可以在任何部分生成光照,如果游戏中有粒子,那么它们就可以投射光照。演讲者想的是所有粒子都能受到光照,然后就问软件工程师行不行,本以为他们会拒绝,但是竟然同意了。他学到的一课就是作为艺术家要贪心点。

 

下面视频是分离出的烟气弹爆炸的部分,可以看到每个Parent Emitter都是带有点光源的光照的,然后修改了光的亮度和颜色,有热点和衰减以及高光的控制,有时也需要用单个光源来表示很多的小光源,来填充某个区域的光,或是模糊整个区域的高光强度,基本上来说就是降低光照反射的光泽强度。


视频24

 

另外一个感觉非常强力的地方是粒子系统可以得到很好的反弹光照和局部光照的近似效果。在预制阶段灯光组和图形工程师构建了使用球谐函数的SH Probe来生成环境光,因为已经有很多的相关信息了,这里不会对SH如何工作的做细节介绍,基本上就是把Probe放入到环境中,由它们来捕捉周围光照环境,光照信息可以烘培到例如光照贴图或环境贴图上,可以在各种方法中使用,最常见的技术是捕捉环境中的反弹光,例如地板和墙壁的反弹。一些情况下因为probe已经被烘培并在环境中使用了,工程师就可以直接使用这些数据用到粒子系统上。

 

SHProbe系统对粒子系统光照的示例,当在区域中移动粒子系统时,局部光照的颜色会被继承到粒子发射器上,提供了很强的场景真实性,粒子系统可以正确的放置在游戏世界中。当接近绿色的广告牌时粒子可以被影响,因为继承了大量的光照颜色。系统的精确度主要依靠的是Probe的密度,在次子中,每35米设置一个probe


视频25

 

下面视频是有方向太阳光对粒子系统的影响,在次子中提供了方法来改变粒子发射器的强度值,这样就可以用不同的元素来模拟出正确的光照效果了。画面中是使用了不同方向太阳光着色值的比较,画面左边显示的是关闭光照的,中间的是60%强度的,右边是相对正确的100%强度的效果。有代表性的是蒸汽粒子的强度要比烟气的着色值低,


视频26

 

因为次子中使用的是基于物理渲染(PBR)的高动态范围(HDR)管线。当使用自发光属性或粒子光照时,就会有极端的偏移,所以那些用PBRHDR来工作的都会指出,在最后调整粒子特效相关的话,会比较麻烦。因为一些原因,用物理正确的曝光值来渲染是不对的做法。首先就是因为游戏设计关系而被搞混乱了,你的能力需要感觉到危险性,但这样就会摧毁玩家的体验,所以无法适应整个游戏的美术风格。第2点虽然是从环境上入手,但是它并不适合表现能力,因为需要的是更多的风格化效果。第3点是这并不是玩家所期望的,玩家想要的是次子是有好莱坞那种真实感的游戏,当能力打中敌人时,要变得非常明亮。

 

下面的示例,是没有在不同时间段做曝光调整的氖气弹(Neon Bolt)的表现,白天和太阳一样亮的调整粒子的HDR曝光值后,在中间晚上的图片就过爆了,之所以这么亮是因为动态的视觉调整(类似自动曝光)的缘故让屏幕其他部分变暗了。

 

如果是为夜晚环境来平衡的曝光值的话,基本上白天就看不到什么了,这就是一个非常大的设计问题,看不到能力射向敌人了。

 

所以选择给粒子发射器加上有符号的曝光偏移值,只会影响视觉特效的Shader,并用Time of Day来调整,这样就解决了大部分的问题,虽然不够完美,但还是足够了。这就意味着要当Time of Day改变时手动来做调整,但还是为了这种一致性还是值得的。在下一款游戏里会去找一种自动方法来改善这种操作。

 

在次子中,也使用了一些实时的曲线噪声(Curl Noise),可以用于不同的方式,例如粒子的加速度。

 

次子中的噪声解决方案包含了一些不同的表达式,返回单个浮点值,或者是向量,这些基础函数包含了一个输入值和输出值,或者是用表示波形紧密程度的波形频率,或者是波形的强度,用迭代时间等来控制迭代频率改变波形的样式。

 

下面视频中就是实时的Curl Noise的演示,使用了无阻尼的加速,就像大多数人做粒子一样,当粒子被能量吸取时,会因为空气阻力而减慢。在开发次子的过程中发现,带有阻尼的粒子会随着时间降低速度和加速度,这样可以获得我们试图达到的更加可信的效果。如果游戏中有大量魔法的能力特效的话,使用非阻尼的Curl可能会适合。


视频27

 

有很多使用粒子噪声的地方,下面的示例是在球体上使用Curl函数,蓝色的是1D Radius Noise,而橘黄色的是3D Positional Noise。结果上看起来也相当不同,接下来的视频里是使用相同的噪声函数来改变形状,根据颜色看他们的表现。这两个都是同样的噪声式样到圆环上,可以更加方便分辨两者的区别。可以看到黄色的是3维空间的移动,而蓝色的只影响半径。接下来的示例中,使用Curl函数调整了粒子的缩放值,这说明使用上是无限制的,任何表现都可以参数化或转化成表达式并通过Curl来起作用。因为可以用很多不同的方式开始,所以非常灵活的使用它。


视频28

 

然后要讨论的是这种新工具集的优缺点。

 

首先先是优点,这里内容很多,一一来讲解。这种工作流的主要优点在于可以作出非常强力的粒子效果,唯一的限制就是特效美术师对数学的理解。必须要学习大量的数学知识,学校老师都没想教这么多。 

使用基于表达式系统的优点在于软件工程师可以更加直观的来正确理解,他们可以对最终资源做更多的事情,也就是很适合软件工程师来工作。

 通过使用GPU粒子,可以使用比声名狼藉2Infamous2 ,次子的前作)多10倍的粒子,像次子中的烟气冲刺就使用了声名狼藉2中一半多的粒子预算了。就是这个技能在战斗力一直存在,由此可以估计粒子数确实非常的多。移动到GPU也可以创建更加复杂的行为,这点也是很大的进步。

 在早期,工具的迭代是需求编译所有变化的,即便编译时间只有56秒,但在修改和查看结果之间的任何延迟都会极大的降低速度。所以软件工程师们让系统成实时来编辑,他们没想到如果能实时编辑的话,特效美术师就能享受制作效果中的乐趣了。

和声名狼藉2相比,光照也得到了很大的改善,连续的跨越了不同的技术,还有大量不同的Shader,而在次子中所有的粒子使用的是一个uber shader,所有的粒子的着色选项是相当受限制的, 这是因为想获得更加精确的排序和光照效果。在声名狼藉2中也粒子没办法生成光源,在实现粒子系统就要实际的去写脚本并对光照做排序。

 

 

然后是一些缺点,也是一些大的项目。粒子系统会很快的就变得极为复杂,这意味着如果一个文件几周没碰再打开的话,就需要花一些时间来收拾残局,例如回想每个表达式。

另外就是和很难开发其他特效美术师的发射器,特别是在命名规则的继承上。因为对发射器和纹理命名上制定了宽松的命名规则,函数的变量名没做限制。但这个并没有什么问题,因为视觉特效组开始工作时倾向于游戏的特定区域,之间并不会有太多的覆盖,有些制作敌人,有些制作环境或主角,但在团队更大而且有很多交叉工作时就会出问题。

没有Shader的编辑和定制,没法做不同原型的技术尝试。限制使用第三方开发包来创作Shader,但可以给软件工程师来实现么,这样会有些慢而且会失去一些细节。

使用基于表达式的系统来修改特效对于美术师来说并不够友好,需要花费特效美术师一些时间来掌握,一部分美术师并没有足够的潜力来应对系统的数学限制,只能尽量去发掘能很好的使用这个系统来工作的人。

所有的特效美术师在基于物理渲染的曝光方面都会遇到问题,这是必须去适应的一些地方,如果对这个领域有什么建议的话,演讲者也希望能邮件发给他。可能有人已经有了计划或是写了关于这方面的论文。

 

在次子开始预制的时候,也不清楚最后会做成什么样子,不知道上游的原画组会提供什么样的概念,不清楚如何实现策划组提出的疯狂设计,这个项目最大的目标就实现一些没人想过的效果,在个人层面上指的是,不要把重点放在过去是如何解决问题的,更多关注在没有什么是不可能的上面。要觉得自己可以,然后找到办法来解决。 最关键的就是需要把什么表达给玩家。这是第一步,也是最重要的一步。要甩掉过去旧的想法来重新开始是非常困难的,但是非常值得的。

 

就像下面的视频一样,是完全使用小鱼模型的粒子系统,这些鱼通过一个简单的表达式避开主角,团队的软件工程师称它为“”智能粒子,这是一个可以完成灵活而强力的粒子特效系统的很好的例子,不需要AI来控制行为。


视频29

 

    

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引