5

Guerrilla首席美术师:《地平线:零之曙光》3A游戏的植被技术与艺术

 2 years ago
source link: http://www.gamelook.com.cn/2022/08/492985
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Guerrilla首席美术师:《地平线:零之曙光》3A游戏的植被技术与艺术

2022-08-15 • 游戏美术

【GameLook专稿,未经授权不得转载!】

GameLook报道/对于一款游戏来说,植被占据了游戏世界资源非常大的部分,尤其是在高品质开放世界游戏中,要做到栩栩如生的视觉效果,植被资源创作无疑会给研发团队带来很大的压力。

在此前的GDC演讲中Guerrilla Games首席美术师Gilbert Sanders讨论了在《地平线:零之曙光(Horizon Zero Dawn)》茂盛而充满活力的植被是如何在保持整体性能的同时呈现在PS平台,并分享了打造过程中的心得。

以下是Gamelook听译的完整内容:

Gilbert Sanders:

lazy.png

据说,上帝在7天时间里创造了一个美丽的世界,甚至还不包括(安息日)星期天在内。然而,Guerrilla Games打造《地平线:零之曙光》的游戏世界却用了7年,而且经常需要在星期天加班。

这是今天唯一的玩笑,其余内容都是与技术相关。

先做个自我介绍,我的名字是Gilbert Sanders,是Guerrilla工作室的首席美术师(Principle Artist),与另外两名美术师一起,我们共同负责《地平线:零之曙光》游戏世界里的植被创作。

自2006年加入Guerrilla以来,我曾在《Killzone 2》担任环境美术,在《Killzone 3》担任着色器纹理美术师。这两款游戏之后,2011年初,我加入了工作室内部的一个小团队,并开始了一个项目的原型创意和测试,也就是后来的《地平线:零之曙光》。在此期间,我也参与了《Killzone:Shadow Fall》的研发,不过,自2014年之后,我就全身心投入到了《地平线:零之曙光》的研发。

玩游戏的时候,你们可能不太会注意到游戏里的植被,因为大多数时候都需要聚焦于游戏里的危险,接下来先看看我们最终在游戏里创造了怎样的植被效果:

lazy.png

我们今天主要分享的内容就是植被创作,在创作、模拟和渲染自然资源方面,大多数人都遇到过类似的挑战。自然资源,即使是在这一代最先进的硬件上,依然是一个真实存在的麻烦。除了麻烦之外,这个话题也是很有趣的,“少花钱多办事”的原则在这里仍是可行的。

lazy.png

图片中是我今天会谈到的一些话题,他们共同呈现了在我们Decima引擎里创造和渲染大量植被遇到的技术以及艺术方面的挑战。不过,首先我们来说一些整体信息、历史,随后再快速开始这些话题。

首先介绍一些Decima引擎着色器的信息,作为美术师,我可以通过这个引擎创造并维护自己的着色器,当然,这是在有技术团队支持的前提下才有可能实现。我们的渲染引擎可以直接通过Maya当中的着色器节点运行,并且工作室的图形程序员还做了很多定制化着色器节点。

lazy.png

Decima引擎使用了延迟渲染,我们希望《地平线:零之曙光》能够在PS4硬件上以30fps实现1080p(在PS4 Pro实现4K)画质。

lazy.png

当我们开始研发新IP《地平线:零之曙光》的时候,将包含图片中的所有东西。第一次听到这个IP的时候,我们就被说服了,尤其是其中的“BBC”大自然,这也是项目的支柱之一。

lazy.png

当我们在做《地平线:零之曙光》的时候,工作室的其他人都在忙着研发PS4游戏《Killzone Shadow Fall》,除了敌人之外,后者有一个关卡可以被用到新游戏当中,这是我们在植被外观和运动制作方面的首次真正测试。

我们很快意识到,由于植被资源并不是静态的,想要把它们进行外包会有些困难。我们还发现,如果按照《Killzone》的方式打造游戏世界内的植被,在《地平线:零之曙光》的开放世界里是行不通的,我们需要重新思考多边形、着色器以及纹理预算。

这个关卡也标志着首个布局系统(placement system)卑微的开端,我们只有最简单的敌人运行其中,但这也告诉我们,如果没有布局系统,就没办法实现我们真正想要的游戏世界。

lazy.png

为了强调着一点,我专门列出了同事Jaap去年(2017年)的演讲,简短来说,我们创造了一个系统,美术师可以在其中描述种类繁多、有趣而可信的环境,可以应用于游戏世界的任何地方。

模拟

lazy.png

我们希望这个系统具有高度艺术指导性,并且支持手动布局美术,它需要是完全数据驱动、确定,而且是本地稳定的。这不仅可以帮助我们快速填充游戏世界,还对测试阶段有很大帮助,比如帮助测试新资源的规模和性能,因此非常推荐同行观看Jaap的演讲。

接下来谈谈我们的树叶运动(foliage movement),从一开始,我们就知道大自然模拟应该与游戏里更广泛的系统相联系,它应该是美术和玩法驱动,而且需要是可控的,需要驱动我们的植被着色器程序。

我们模拟的基础是全局风力场(Global wind force field)。在《地平线:零之曙光》之前,风立场就是风箱(wind box),我们主要用它来驱动粒子运动,它们是在本地使用、手动布局,而且规模较小。

全局风力场是这些风箱的扩展版,不过进行了一些改变。我们的全局风力场是在每帧开始运行的一个计算机着色器,模拟一道风力在四类spring setting上的完整影响,并更新着色器可以取样的3D纹理。

首先是与玩家相关,也就是镜头FOV,这可以让模拟以高分辨率向玩家近距离呈现,在远距离,我们以非常低的分辨率展现。我们来快速浏览一下游戏里的全局风力系统效果:

lazy.png

它可以模拟四个不同类别的Spring setting,在不需要任何额外着色逻辑的情况下,它可以让我们为三种资源类型创造四种不同的运动,我们将这些资源分为三种类型(树木、植物、草皮),不过我们还把特殊物体统一划归第四类,也就是特别物体,比如横幅、防水布等等。

不过,考虑到渲染和着色的目的,我们只用了两种着色器。实际上,我们开始的时候只用了一个着色器解决所有事情,但后来发现,草皮需要特别的方法,所以我们专门给他打造了一个着色器。

lazy.png

草皮会在后面说,但我这里希望先谈谈树木和植物着色器。我们有了模拟风的方式,但这仍然需要转化为资源在屏幕上的运动。为此,我们采取了类似GPU Gems 3的方式,在2011年我开始做植被的时候,这是主要的参考文献,直到现在,这种存储蒙皮数据的方式仍是研发过程中没有改变的少数方法之一。我们在7年里改变了很多东西,但这种方式在任何规模的资源都是可用的。

为了让树木看起来真实,我们需要有三种程度的细节:大规模运动,也就是整个资源的弯曲;中型运动,即树枝摇晃;还有就是小型运动,也就是树梢或者树叶运动细节。

lazy.png

首先是整棵树的运动,所以我们使用了资源高度作为大规模运动的要素。

lazy.png

下一个等级的运动是树枝以及附属物的运动,从树干开始,这里的要素全部以蓝色显示,简单来说,我们存储了树枝距离。

lazy.png

第三个等级的运动是树叶,如图中的红色通道,这里我们做的是存储分枝距离。

lazy.png

有了顶点着色器(vertex shader),我们的植被就可以工作了,所有的植被资源都需要通过顶点着色器驱动,所以我们最终有了一系列的不同形式根据资源调整动画。这些变化形式被标记成了橘色,足以处理我们在游戏里所有的树木运动。

树木硬度是最容易处理的,对于树枝,我们有3个控制方式:弯曲、摇摆和上下运动。最后一个动态是叶子运动,取决于风力强度不同,我使用一个小型3D单行噪声纹理(16x16x16)模拟树叶运动。

lazy.png

由于游戏里的植物使用了与树木同样的着色器,但同时规模又更小,我们不得不去掉这些植物的弯曲效果,这不仅降低了性能开销,还避免了它们弯曲到地形当中。另外,我们着色器内另一个比较有帮助的是这个倾斜公式,可以用来计算不同资源受到风力影响的运动效果。

当我们开始《地平线:零之曙光》研发的时候,对草皮有着很大的目标。草皮需要无处不在,我们希望这些草皮是几何体,能够与风力和其他力场有真实的互动效果,但我们没有考虑这可能会带来什么挑战。

我们开始尝试,但草皮渲染占据了整帧,所以不得不对草皮进行不断简化,尝试找到事半功倍效果的方法。

lazy.png

这就是我们得到的结果,我们为不同场景设计了三种形式的LOD,不用再对普通纹理取样。

lazy.png

我们对全局风力场进行采样,这就是游戏内草皮运动的基础状态。不过,它并不能带来非常壮观的视觉效果,我们需要更多的动态,而且我们不希望草皮长期朝着同一个方向运动,也不能一直静止不动。

在此基础上,我们分别增加了大范围动态和小范围动态,他们共同形成了环境动态,占据了草皮动画量的80%。

除了模拟之外,我们的草皮还必须有更多功能。我们想要避免的情形是,当玩家低头看的时候发现几何体消失了,所以我们根据镜头对草皮网格进行倾斜,就像下图那样:

lazy.png

这种情况下,草皮看起来就不会是一成不变的卡片了。

lazy.png

此外,我们还让草皮与地面贴的更紧,并且减少了远处草皮的动画量,降低了网格数量使得这些草皮加载更容易,提高了游戏性能。

着色

在游戏里,实现透明度的代价是非常高的,哪怕是alpha阶段也很昂贵,在研发《Killzone》的那些年,我们对于alpha资源着色并没有太多经验。尽管过度简单,植被也很大程度上依赖于alpha测试,所以问题在于,我们如何打造《地平线:零之曙光》需要的那么多草皮?

lazy.png

我们的解决方案是将所有的植被纹理都在两个通道渲染,我们在深度通道做alpha测试,这时候可以得到所有资源的深度;几何体通道代价更昂贵,但效率很高。

那么,我们分析游戏里的一帧画面来看它对GPU渲染时间意味着什么:

lazy.png

这是游戏内的GPU Profiler截图,这里的百分比是我们的布局系统处理的资源,我们比较感兴趣的是,depthprime几乎占了整帧10%,几何体占据11.5%左右,它们总共是21.345%。

lazy.png

我们再看没有了depthprime之后的开销,与上面的差别很大。简单来说,深度通道可以节约大量的性能开销。

lazy.png

《地平线:零之曙光》的Alpha纹理使用了符号距离(Signed Distance)纹理,可以让美术师在着色器里控制纹理大小。我们可以在着色器里进行放大和缩小,控制距离远近,这样做主要是为了调整不同距离看到的视觉效果品质,我们还在着色器里加入了可以调节的雪花。

我们始终在努力提升游戏性能,并且发现在着色器里调节Alpha的开销很大。

lazy.png
lazy.png

再来看看GPU Profiler,需要声明的是,在研发过程中,由于发生太多的变化,很难复制特定情形,所以这是我做的一个模仿版本,注意关注depthprime的变化,阴影占据了整帧的9%左右,这时候depthprime是6%,当我们将阴影降低2%之后,depthprime降低了1%。

lazy.png

那么,我们是如何实现的呢?在alpha测试之后,我们计算了输入图形的范围,生成了常规的Mip-chain,这是有意义的,因为我们已经在着色器里进行了取样。

lazy.png

这是Mip-chain的效果展示。

lazy.png

Alpha当然是越小越好,但对于你需要绘制的大量资源来说,还需要适应缓存,尤其是对于草皮来说,而且你需要有比较好的抗锯齿解决方案才能实现比较好的视觉效果。

lazy.png

对于抗锯齿这个问题,感兴趣的同行可以参考小岛工作室的这样演讲。

渲染

我们的Decima引擎使用延迟渲染,植被着色器写入这些G-Buffer:

lazy.png

这些是我们为着色器提供的植被纹理,唯一的例外是草皮从没有AO(环境光遮蔽)纹理。

lazy.png

图片下方是比较典型的植被纹理设置。

lazy.png

对于普通物体,我们不需要做复杂的3D渲染,比如图中的植物,只需要在切线空间里翻动即可。

lazy.png

不过,对于高度依赖三角形的资源来说,“错误”翻动是有帮助的,我们可以对比以下效果:

lazy.png

反射率

我们游戏里所有的植被都是着色的,我们为此做了纹理数组,并且基于资源类型、游戏世界数据和生态环境为美术师提供了多种选择。

lazy.png

为此,我们将所有的植被反射色值进行了平均,对不想着色的部分还做了蒙皮纹理,结果就是前景颜色与背景颜色混合,让亮的地方看起来更亮,暗的地方看起来更暗。

lazy.png

我们将粗糙度和反射率从纹理样本中剥离出来,对于反射率我们设置为4% Dielectric,对于粗糙度,我们希望给美术师更多控制权,他们可以对环境光遮挡、遮挡纹理和半透明纹理进行调节,以便简单在一个纹理当中区分树叶与树皮的粗糙度。对于草皮,我们选择了用半透明纹理实现类似的效果。

lazy.png

图片中的前三个是没有办法在着色器中调整的,后面三个是可以让美术师进行调节的。

资源创作

接下来我们来看植被资源的创作管线,当我们开始做《Killzone》的时候,我们知道如何打造这些东西:

lazy.png
lazy.png
lazy.png

这些就是《Killzone》游戏里的植被。

lazy.png

这是我们2014年初做出来的效果,用来确定森林里的植被密度。

到了2015年的E3,我们有了《地平线:零之曙光》的第一个可玩版本,由于需要让开发者在现场展示,我们做了大量的LOD,随着展会临近,我们在思考如何在不减少三角形的情况下提高这些LOD的外观效果和性能。

lazy.png

我们最初是从低网格开始的,如果喜欢在游戏里的效果,那么就开始增加更多的细节。

比如,我们用了很短的时间打造了一棵树可能拥有的外观,在《地平线:零之曙光》研发过程中,我们用SpeedTree制作这些资源,如果对效果不满意,我们可以快速更改,如果满意,就迅速制作高分辨率资源。

lazy.png

这是我们打造的一个高分辨率树枝,使用了Maya和SpeedTree。

lazy.png

一旦对这些纹理感到满意,我们就放到Maya进行纹理烘焙,做成我们游戏模式里需要的UV空间。

lazy.png

随后,我们回到快速模式,把他当作LOD3,并开始加载。

lazy.png

接下来我们把快速模式做出来的网格放到游戏里测试,有人注意到我们把主角放在背景当中了吗?

lazy.png

我们用内部打造的houdini工具将资源导出到Maya,然后就是将资源设置从Maya导入到游戏里。

lazy.png

一棵树的打造过程大致就是上图的样子

lazy.png

这是另一种资源(植物)的制作

阴影反射

lazy.png

对于太阳光阴影,我们使用了四种级联,对于隔层级联,我们仅覆盖主角Aloy,意味着她自己以及她的衣服和周围物体都有比较高质量的阴影,所有的植被在这个级联都不会被渲染。

lazy.png

级联0和1代表普通阴影映射,也就是植被渲染,我们还使用了距离级联来渲染高度映射。不同的级联之间,我们采取了淡入淡出效果,让两个级联之间的切换不会令人觉得不自然。

由于时间的关系,这部分我们不做特别详细的解释。

总结

BTATVH49-1024x562.jpg

作为总结,我简单介绍一些推荐同行们使用的植被创作方法和工具,比如Depth Prime、定制化Mip Chain、LOD up,将你的shadow casters与视觉网格分开,使用布局系统。另外一个对我们带来很大帮助的就是,这一切都是我们内部完成的,这使得植被外观和性能得以不断迭代、提升,以上就是我今天的分享。

如若转载,请注明出处:http://www.gamelook.com.cn/2022/08/492985


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK