Guerrilla首席美术师:《地平线:零之曙光》3A游戏的植被技术与艺术
【GameLook专稿,未经授权不得转载!】
GameLook报道/对于一款游戏来说,植被占据了游戏世界资源非常大的部分,尤其是在高品质开放世界游戏中,要做到栩栩如生的视觉效果,植被资源创作无疑会给研发团队带来很大的压力。
在此前的GDC演讲中Guerrilla Games首席美术师Gilbert Sanders讨论了在《地平线:零之曙光(Horizon Zero Dawn)》茂盛而充满活力的植被是如何在保持整体性能的同时呈现在PS平台,并分享了打造过程中的心得。
以下是Gamelook听译的完整内容:
Gilbert Sanders:
据说,上帝在7天时间里创造了一个美丽的世界,甚至还不包括(安息日)星期天在内。然而,Guerrilla Games打造《地平线:零之曙光》的游戏世界却用了7年,而且经常需要在星期天加班。
这是今天唯一的玩笑,其余内容都是与技术相关。
先做个自我介绍,我的名字是Gilbert Sanders,是Guerrilla工作室的首席美术师(Principle Artist),与另外两名美术师一起,我们共同负责《地平线:零之曙光》游戏世界里的植被创作。
自2006年加入Guerrilla以来,我曾在《Killzone 2》担任环境美术,在《Killzone 3》担任着色器纹理美术师。这两款游戏之后,2011年初,我加入了工作室内部的一个小团队,并开始了一个项目的原型创意和测试,也就是后来的《地平线:零之曙光》。在此期间,我也参与了《Killzone:Shadow Fall》的研发,不过,自2014年之后,我就全身心投入到了《地平线:零之曙光》的研发。
玩游戏的时候,你们可能不太会注意到游戏里的植被,因为大多数时候都需要聚焦于游戏里的危险,接下来先看看我们最终在游戏里创造了怎样的植被效果:
我们今天主要分享的内容就是植被创作,在创作、模拟和渲染自然资源方面,大多数人都遇到过类似的挑战。自然资源,即使是在这一代最先进的硬件上,依然是一个真实存在的麻烦。除了麻烦之外,这个话题也是很有趣的,“少花钱多办事”的原则在这里仍是可行的。
图片中是我今天会谈到的一些话题,他们共同呈现了在我们Decima引擎里创造和渲染大量植被遇到的技术以及艺术方面的挑战。不过,首先我们来说一些整体信息、历史,随后再快速开始这些话题。
首先介绍一些Decima引擎着色器的信息,作为美术师,我可以通过这个引擎创造并维护自己的着色器,当然,这是在有技术团队支持的前提下才有可能实现。我们的渲染引擎可以直接通过Maya当中的着色器节点运行,并且工作室的图形程序员还做了很多定制化着色器节点。
Decima引擎使用了延迟渲染,我们希望《地平线:零之曙光》能够在PS4硬件上以30fps实现1080p(在PS4 Pro实现4K)画质。
当我们开始研发新IP《地平线:零之曙光》的时候,将包含图片中的所有东西。第一次听到这个IP的时候,我们就被说服了,尤其是其中的“BBC”大自然,这也是项目的支柱之一。
当我们在做《地平线:零之曙光》的时候,工作室的其他人都在忙着研发PS4游戏《Killzone Shadow Fall》,除了敌人之外,后者有一个关卡可以被用到新游戏当中,这是我们在植被外观和运动制作方面的首次真正测试。
我们很快意识到,由于植被资源并不是静态的,想要把它们进行外包会有些困难。我们还发现,如果按照《Killzone》的方式打造游戏世界内的植被,在《地平线:零之曙光》的开放世界里是行不通的,我们需要重新思考多边形、着色器以及纹理预算。
这个关卡也标志着首个布局系统(placement system)卑微的开端,我们只有最简单的敌人运行其中,但这也告诉我们,如果没有布局系统,就没办法实现我们真正想要的游戏世界。
为了强调着一点,我专门列出了同事Jaap去年(2017年)的演讲,简短来说,我们创造了一个系统,美术师可以在其中描述种类繁多、有趣而可信的环境,可以应用于游戏世界的任何地方。
模拟
我们希望这个系统具有高度艺术指导性,并且支持手动布局美术,它需要是完全数据驱动、确定,而且是本地稳定的。这不仅可以帮助我们快速填充游戏世界,还对测试阶段有很大帮助,比如帮助测试新资源的规模和性能,因此非常推荐同行观看Jaap的演讲。
接下来谈谈我们的树叶运动(foliage movement),从一开始,我们就知道大自然模拟应该与游戏里更广泛的系统相联系,它应该是美术和玩法驱动,而且需要是可控的,需要驱动我们的植被着色器程序。
我们模拟的基础是全局风力场(Global wind force field)。在《地平线:零之曙光》之前,风立场就是风箱(wind box),我们主要用它来驱动粒子运动,它们是在本地使用、手动布局,而且规模较小。
全局风力场是这些风箱的扩展版,不过进行了一些改变。我们的全局风力场是在每帧开始运行的一个计算机着色器,模拟一道风力在四类spring setting上的完整影响,并更新着色器可以取样的3D纹理。
首先是与玩家相关,也就是镜头FOV,这可以让模拟以高分辨率向玩家近距离呈现,在远距离,我们以非常低的分辨率展现。我们来快速浏览一下游戏里的全局风力系统效果:
它可以模拟四个不同类别的Spring setting,在不需要任何额外着色逻辑的情况下,它可以让我们为三种资源类型创造四种不同的运动,我们将这些资源分为三种类型(树木、植物、草皮),不过我们还把特殊物体统一划归第四类,也就是特别物体,比如横幅、防水布等等。
不过,考虑到渲染和着色的目的,我们只用了两种着色器。实际上,我们开始的时候只用了一个着色器解决所有事情,但后来发现,草皮需要特别的方法,所以我们专门给他打造了一个着色器。
草皮会在后面说,但我这里希望先谈谈树木和植物着色器。我们有了模拟风的方式,但这仍然需要转化为资源在屏幕上的运动。为此,我们采取了类似GPU Gems 3的方式,在2011年我开始做植被的时候,这是主要的参考文献,直到现在,这种存储蒙皮数据的方式仍是研发过程中没有改变的少数方法之一。我们在7年里改变了很多东西,但这种方式在任何规模的资源都是可用的。
为了让树木看起来真实,我们需要有三种程度的细节:大规模运动,也就是整个资源的弯曲;中型运动,即树枝摇晃;还有就是小型运动,也就是树梢或者树叶运动细节。
首先是整棵树的运动,所以我们使用了资源高度作为大规模运动的要素。
下一个等级的运动是树枝以及附属物的运动,从树干开始,这里的要素全部以蓝色显示,简单来说,我们存储了树枝距离。
第三个等级的运动是树叶,如图中的红色通道,这里我们做的是存储分枝距离。
有了顶点着色器(vertex shader),我们的植被就可以工作了,所有的植被资源都需要通过顶点着色器驱动,所以我们最终有了一系列的不同形式根据资源调整动画。这些变化形式被标记成了橘色,足以处理我们在游戏里所有的树木运动。
树木硬度是最容易处理的,对于树枝,我们有3个控制方式:弯曲、摇摆和上下运动。最后一个动态是叶子运动,取决于风力强度不同,我使用一个小型3D单行噪声纹理(16x16x16)模拟树叶运动。
由于游戏里的植物使用了与树木同样的着色器,但同时规模又更小,我们不得不去掉这些植物的弯曲效果,这不仅降低了性能开销,还避免了它们弯曲到地形当中。另外,我们着色器内另一个比较有帮助的是这个倾斜公式,可以用来计算不同资源受到风力影响的运动效果。
当我们开始《地平线:零之曙光》研发的时候,对草皮有着很大的目标。草皮需要无处不在,我们希望这些草皮是几何体,能够与风力和其他力场有真实的互动效果,但我们没有考虑这可能会带来什么挑战。
我们开始尝试,但草皮渲染占据了整帧,所以不得不对草皮进行不断简化,尝试找到事半功倍效果的方法。
这就是我们得到的结果,我们为不同场景设计了三种形式的LOD,不用再对普通纹理取样。
我们对全局风力场进行采样,这就是游戏内草皮运动的基础状态。不过,它并不能带来非常壮观的视觉效果,我们需要更多的动态,而且我们不希望草皮长期朝着同一个方向运动,也不能一直静止不动。
在此基础上,我们分别增加了大范围动态和小范围动态,他们共同形成了环境动态,占据了草皮动画量的80%。
除了模拟之外,我们的草皮还必须有更多功能。我们想要避免的情形是,当玩家低头看的时候发现几何体消失了,所以我们根据镜头对草皮网格进行倾斜,就像下图那样:
这种情况下,草皮看起来就不会是一成不变的卡片了。
此外,我们还让草皮与地面贴的更紧,并且减少了远处草皮的动画量,降低了网格数量使得这些草皮加载更容易,提高了游戏性能。
着色
在游戏里,实现透明度的代价是非常高的,哪怕是alpha阶段也很昂贵,在研发《Killzone》的那些年,我们对于alpha资源着色并没有太多经验。尽管过度简单,植被也很大程度上依赖于alpha测试,所以问题在于,我们如何打造《地平线:零之曙光》需要的那么多草皮?
我们的解决方案是将所有的植被纹理都在两个通道渲染,我们在深度通道做alpha测试,这时候可以得到所有资源的深度;几何体通道代价更昂贵,但效率很高。
那么,我们分析游戏里的一帧画面来看它对GPU渲染时间意味着什么:
这是游戏内的GPU Profiler截图,这里的百分比是我们的布局系统处理的资源,我们比较感兴趣的是,depthprime几乎占了整帧10%,几何体占据11.5%左右,它们总共是21.345%。
我们再看没有了depthprime之后的开销,与上面的差别很大。简单来说,深度通道可以节约大量的性能开销。
《地平线:零之曙光》的Alpha纹理使用了符号距离(Signed Distance)纹理,可以让美术师在着色器里控制纹理大小。我们可以在着色器里进行放大和缩小,控制距离远近,这样做主要是为了调整不同距离看到的视觉效果品质,我们还在着色器里加入了可以调节的雪花。
我们始终在努力提升游戏性能,并且发现在着色器里调节Alpha的开销很大。
再来看看GPU Profiler,需要声明的是,在研发过程中,由于发生太多的变化,很难复制特定情形,所以这是我做的一个模仿版本,注意关注depthprime的变化,阴影占据了整帧的9%左右,这时候depthprime是6%,当我们将阴影降低2%之后,depthprime降低了1%。
那么,我们是如何实现的呢?在alpha测试之后,我们计算了输入图形的范围,生成了常规的Mip-chain,这是有意义的,因为我们已经在着色器里进行了取样。
这是Mip-chain的效果展示。
Alpha当然是越小越好,但对于你需要绘制的大量资源来说,还需要适应缓存,尤其是对于草皮来说,而且你需要有比较好的抗锯齿解决方案才能实现比较好的视觉效果。
对于抗锯齿这个问题,感兴趣的同行可以参考小岛工作室的这样演讲。
渲染
我们的Decima引擎使用延迟渲染,植被着色器写入这些G-Buffer:
这些是我们为着色器提供的植被纹理,唯一的例外是草皮从没有AO(环境光遮蔽)纹理。
图片下方是比较典型的植被纹理设置。
对于普通物体,我们不需要做复杂的3D渲染,比如图中的植物,只需要在切线空间里翻动即可。
不过,对于高度依赖三角形的资源来说,“错误”翻动是有帮助的,我们可以对比以下效果:
反射率
我们游戏里所有的植被都是着色的,我们为此做了纹理数组,并且基于资源类型、游戏世界数据和生态环境为美术师提供了多种选择。
为此,我们将所有的植被反射色值进行了平均,对不想着色的部分还做了蒙皮纹理,结果就是前景颜色与背景颜色混合,让亮的地方看起来更亮,暗的地方看起来更暗。
我们将粗糙度和反射率从纹理样本中剥离出来,对于反射率我们设置为4% Dielectric,对于粗糙度,我们希望给美术师更多控制权,他们可以对环境光遮挡、遮挡纹理和半透明纹理进行调节,以便简单在一个纹理当中区分树叶与树皮的粗糙度。对于草皮,我们选择了用半透明纹理实现类似的效果。
图片中的前三个是没有办法在着色器中调整的,后面三个是可以让美术师进行调节的。
资源创作
接下来我们来看植被资源的创作管线,当我们开始做《Killzone》的时候,我们知道如何打造这些东西:
这些就是《Killzone》游戏里的植被。
这是我们2014年初做出来的效果,用来确定森林里的植被密度。
到了2015年的E3,我们有了《地平线:零之曙光》的第一个可玩版本,由于需要让开发者在现场展示,我们做了大量的LOD,随着展会临近,我们在思考如何在不减少三角形的情况下提高这些LOD的外观效果和性能。
我们最初是从低网格开始的,如果喜欢在游戏里的效果,那么就开始增加更多的细节。
比如,我们用了很短的时间打造了一棵树可能拥有的外观,在《地平线:零之曙光》研发过程中,我们用SpeedTree制作这些资源,如果对效果不满意,我们可以快速更改,如果满意,就迅速制作高分辨率资源。
这是我们打造的一个高分辨率树枝,使用了Maya和SpeedTree。
一旦对这些纹理感到满意,我们就放到Maya进行纹理烘焙,做成我们游戏模式里需要的UV空间。
随后,我们回到快速模式,把他当作LOD3,并开始加载。
接下来我们把快速模式做出来的网格放到游戏里测试,有人注意到我们把主角放在背景当中了吗?
我们用内部打造的houdini工具将资源导出到Maya,然后就是将资源设置从Maya导入到游戏里。
一棵树的打造过程大致就是上图的样子
这是另一种资源(植物)的制作
阴影反射
对于太阳光阴影,我们使用了四种级联,对于隔层级联,我们仅覆盖主角Aloy,意味着她自己以及她的衣服和周围物体都有比较高质量的阴影,所有的植被在这个级联都不会被渲染。
级联0和1代表普通阴影映射,也就是植被渲染,我们还使用了距离级联来渲染高度映射。不同的级联之间,我们采取了淡入淡出效果,让两个级联之间的切换不会令人觉得不自然。
由于时间的关系,这部分我们不做特别详细的解释。
总结
作为总结,我简单介绍一些推荐同行们使用的植被创作方法和工具,比如Depth Prime、定制化Mip Chain、LOD up,将你的shadow casters与视觉网格分开,使用布局系统。另外一个对我们带来很大帮助的就是,这一切都是我们内部完成的,这使得植被外观和性能得以不断迭代、提升,以上就是我今天的分享。
如若转载,请注明出处:http://www.gamelook.com.cn/2022/08/492985