
导语
大家好!我是 Alexander Sheynin,Crytek 的高级硬表面美术师(Senior Hard Surface Artist),在游戏行业有超过 7 年的经验。我曾参与过《猎杀对决》《ILL》《Returnal》《Remnant 2》《The Matrix Awakens》《Miasma Chronicles》《7 Days To Die》等多款游戏的制作。
我一直非常喜欢科幻与恐怖题材,主要是因为这些题材在艺术表现上的完成度极高:如何打造一个物件,并让它显得真实可信。
所以从我职业生涯一开始,我就一直痴迷于事物之所以吸引人眼球的本质——是什么让它们脱颖而出、显得可信。在我的作品中,我非常依赖细节:每一个网格都应当服务于某种功能;每一张纹理都应当为资产注入生命与故事。
但这不只是独特的细节化贴图、复杂的打光或强烈的剪影;人类会把图像感知为一个统一的整体,所以一旦平衡被打破,一切就会显得虚假。在这篇文章里,我将向你展示我为《猎杀对决 1896》制作武器的方法。

Nitro Express Checks and Balances
Nitro Express Checks and Balances 的概念图由我的同事 Ivo Nies 绘制。这把步枪是我们为《猎杀对决 1896》最新「Road To Hell」活动打造的军用奢华套装中的一件武器,套装还包含其他几把武器。
设计方向是打造一把仪式感的军用武器:它应当使用高身份感的材料,如黄金或异域木材,但依然可以略带磨损,带有一些徽记、部队纹章或军衔,使用纹饰装饰,并以绳索系带点缀。
在动手之前,我总会先制作一块参考板,把武器拆解成各个组件,就像真实的枪械由多个部件组合而成那样。它并不局限于某一种特定的武器型号、颜色或材质;通常我会加入一些类似的东西,以便挑选最合适的方案。这里很重要的一点是:我会做笔记,并把参考板整理得井井有条,方便其他美术师跟随。

参考板完成、我对接下来的工作有了一定把握之后,我会在引擎里建立一个武器角色(weapon character),并在 Blender 中搭建场景结构。它包含若干个独立的集合(collection),每个都以制作阶段命名。’From Engine’ 存放原始的武器模型部件(如果我要做它的新变体)或一些网格参考;’Export’ 存放所有要导出到引擎的节点网格;’Blockout/Highpoly/Lowpoly’ 则是实际处理几何体的集合。我们会在下一章近距离观察每一个集合。

白模(Blockout)
于是,我们的工作迎来了第一个与概念相关的特性:概念并不是你需要 100% 照做的蓝图。它的主要作用是作为指引,为你点明主题、定下基调,但某些设计决策的责任落在 3D 美术师身上。这是因为我们的首要目标是为玩家提供尽可能高质量的资产——也就是他们在游戏第一人称视角下看到的那一个。概念美术团队主要在 2D 工作,所以如果我们直接照搬,一些比例或体积可能会失真。我们需要在两者之间保持平衡:调整形状与形态以匹配游戏内完美的视觉效果,同时仍然遵循概念图。

我尽量让所有网格保持相对程序化,方便日后轻松修改:圆柱形物体由多边形线配合 Screw(螺旋)、Solidify(加厚)和 Weld(焊接)修改器生成,而大多数网格都带有布尔操作数(boolean operands)。为此我使用了 Hard Ops,所以我把所有布尔运算都放在一个名为 Cutters 的对应子文件夹里。



要把资产导出到引擎,我们使用一个特殊的内部插件,它作用于一个空物体(empty)以及父级到它的网格。但这里出现了一个问题:我需要能方便地访问网格编辑、材质修改和变换微调,而不必在每次导出时都重新父子化并展开白模。
于是几何节点(Geometry Nodes)的力量登场了。Blender 提供了由节点驱动的程序化操作的灵活性,相比修改器,它极其强大、易于管理且省时。虽然我仍会保留一些手动操作(比如前面展示的枪管,因为某些情况下手动可能更快),但最近我在工作流中引入了越来越多的几何节点。
它的工作原理是:我把 Blockout 集合中正在制作的网格,引用到 Export 集合中一个父级到导出空物体的对象里,这让我可以在不手动复制每个对象、也不丢失修改器堆栈的情况下,程序化地展开 UV、指定材质并调整着色。

首先,我添加一个立方体(或任意其他对象),把它父级到导出空物体,启用几何节点,并移除原始的 Group Input。取而代之的是,我放入 Object Info 节点——它们是对 Blockout 集合中网格的引用;勾选 Relative(相对)选项后,所有被引用的网格都会保持它们在 Blockout 中的变换。我之所以用这个而不是 Collection Info 节点,是因为更便于逐个操控对象;例如,当我沿链条向下分配材质 ID 和材质时。之后,我有了一套基于角度的自动展开(auto-unwrap)方案和 UV 打包(packing)算法。Realize Instances(实现实例)节点用于把引用的信息转换成真实几何体;Triangulate(三角化)是保留法线信息的网格三角剖分。
这样就完成了。现在我可以对网格做任何调整:破坏性编辑、修改器、布尔,甚至几何节点操作——所有这些都会传递到导出立方体,并导出到引擎,这样我就能实时地改变剪影或调整材质。在制作的后期,我会用 Highpoly/Lowpoly 集合中的对应网格替换掉 Blockout 中引用的网格。
贝壳与装饰元素的设置
虽然这部分在概念图里看起来相当简单,但在 3D 中,它其实并不那么直观,需要几次变换迭代才能在武器上显得得体。


我从一个简单的形状开始,就像上面截图里的紫色段,然后镜像它、并把它变形,使形状从侧面可见,同时仍保留枪管与机匣相接处的圆形中心。如果我把它保持为笔直对称的形状,它要么会被机匣网格遮挡,要么两枪管之间的距离会太宽。
绿色和蓝色肋条的数量、它们的轮廓以及扭转值也调整了好几次,以确保没有可见的网格交叠,且一切看起来自然。红色环也是如此——它们共享相同的厚度与轮廓,但倾斜与半径不同。所以这里我同时用到了几何节点和修改器。


在制作绳索和皮带缠绕时,也用了同样的方法。先做一段;然后通过创建两个临时网格实例,确保它能完美平铺(tile);这样更便于编辑边界。之后,施加 Array(阵列)、Curve Deform(曲线变形)、Weld(焊接)和 Subdivision(细分)。


枪托的主体网格是用布尔和 Shrinkwrap(收缩包裹)制作的:我从一个大的低多边形块开始,设置折痕(crease),再把它拆分成若干部分。为了控制枪托靠近星形装饰处的厚度,我复制了基础网格,并用 Shrinkwrap 修改器把被减网格的表面贴合过去。这样一来,它不仅提供了类似 Lattice(晶格)和 Surface Deform(表面变形)修改器的控制力,还让我能用目标包裹网格更精确地调整法线与表面平滑。


一旦我对所有部件都满意了,就把它们导出到引擎,在游戏里检查;如果一切看起来没问题,就可以进入下一个阶段。

高多边形(High Poly)
在这个阶段,我把细分网格与雕刻部件在 Zbrush 中合并。另外需要提一句:所有绳索都是在 Subdiv(细分)中制作的,因为之后我需要展开 UV 并绘制它们,以便把有方向性的绳索纹理传递(transfer)到合并后的低多边形网格上。
方法很简单:你从 Blender 里取出布尔结构,导入 ZBrush,在一个文件夹(folder)里重建同样的结构。借助 Live Boolean(实时布尔)选项,你可以非破坏性地操控操作数,包括整套雕刻工具集。我偏爱这个方法,因为它给了我惊人的多边形上限(polycount),同时还能保持不错的视口性能;我可以手动调整、打磨某些区域,并受益于 polygroups(多边形组)和 Polish by Features(按特征抛光)选项。
如果我不确信哪种方案最好,我随时可以用 Morph Target(形变目标)和 Layers(图层)把网格存入内存,做一些调整,再用 Morph Target 笔刷手动绘制回去;或者降低某个图层的不透明度,让想要的效果以不到满强度的程度呈现。我在所有工作中都使用这个方法,但这次轻松得多,因为这个资产相当干净,不需要重度破坏边缘或缝合接缝。

3D 装饰是在 subD(细分曲面)中制作,再与 ZBrush 中的对应部件合并,以便在交点处有平滑的过渡,减面(decimation)之后作为单个部件导出回 Blender。

围巾的底部是用几何节点制作的:一个简单矩形平面,配合 Distribute Points on Faces(在面上分布点)和 Instance on Points(在点上实例化)节点,把程序化线(procedural thread)接入 Noise Texture(噪波纹理)节点来驱动扭曲。

低多边形、UV 与烘焙
制作低多边形的过程并不算复杂。大多数时候,我复用白模阶段的网格;只需应用布尔运算即可,如果有任何剧烈改动(比如合并的 3D 装饰),我就用 RetopoFlow 做一些手动重拓扑(retopology)。
关于低多边形制作,最常被问到的问题是:你需要多少个多边形/线段。你总可以通过在场景里设置相机视角,或者把武器放进游戏第一人称视角来对比衡量:剪影应当足够平滑,且没有任何可见的多边形边缘。所以,如果基于 16 边的圆柱枪管出现了可见边缘,就逐步增加线段来把圆形轮廓变圆。
但有时我们需要增加更多几何体,即便它不影响剪影。例如,为了更好的 UV 打包,当我们有细长的岛屿(island)无法填满整个 UV 正方形时。或者当我们有过度强烈的法线弯曲伪影时,切几刀边缘有助于消除扭曲。
在我的案例中,我把星形装饰元素保留在几何体中,因为它们在游戏第一人称视角下会被近距离看到。我也让绳索保持相当密集,因为它要绑骨(rig),需要足够的线段来表现真实的物理效果。
于是,我先用低多边形网格再次更新导出代理(proxy)的几何节点,以便在游戏里测试。枪管上花哨的绳索带(cord belt)是通过对原始高多边形重新网格化(remesh)做出的,这样我得到一块实体,绳索之间没有孔洞;然后我创建了一个顶点组属性(vertex group attribute),在权重绘制(Weight Paint)模式下绘制权重,供之后的 Decimate(减面)修改器使用。
思路是让减面器在游戏视角中玩家不易察觉的区域削减更多几何体。你会注意到内侧区域呈橙色,而可见的外侧区域影响较小。皮带边缘被涂成蓝色,意味着减面强度为 0(不削减)。减面完成后,我折叠修改器,在里面切一条直线——这是一条 UV 接缝(seam),让我可以把这块作为一个边缘笔直的矩形来展开。

武器被划分为 5 个贴图集(texture set),主要是因为游戏内的配件(attachment)设置:每一个实心部件在被替换时(如果武器有变体)都可能被替换。所以它包含枪管(蓝)、护木(橙)、机匣(绿)、绳索(黄)和枪托(深青)。
我做了一些测试性的 UV 打包,来衡量各贴图集之间的纹素密度(texel density)。除护木外,其余大致相同——护木的数值略高,可以容纳更多内容。这就是为什么绳索的皮革带与单股绳子被纳入了这个集。这里有一个要点:尽管枪托原本计划用 4×2K,但在贴图过程中发现,由于细节很小,它需要更高分辨率。因为它以正方形格式展开,所以变化不大。
然而,如果我是在贴图完成后,才把一个矩形展开的枪管升级到完整正方形,就可能会破坏某些纹理缩放与平铺(tiling)。这就是为什么我建议在最终 UV 打包与烘焙之前,先做些测试性贴图。

一条双股装饰绳(double decorative cord)被制作出来,并作为 trim(条带)展开——它是一段长而重复的部件,被变形贴合到曲线物体上。

其余部分就相当常规了:复制对称部件以节省 UV 空间;展开时把岛屿拉直,这样接缝处就不会出现伪影;放大属于最细致、最可见区域的岛屿。一旦我对 UV 集满意了,就导出网格,用于在 Marmoset Toolbag 中烘焙法线(normal)、环境光遮蔽(AO)和颜色 ID 遮罩(color ID mask)。此外,我还烘焙了一些之前提到的高多边形绳索上应用的纹理:如果要在 Substance 3D Painter 里通过遮罩在合并网格上复现同样的方向性,会太费时。

最终的网格设置如下:烘焙完成后,我同时导出装配好的枪和爆炸视图(exploded)部件,这样我既可以舒服地在孤立细节上绘制,也可以在整个枪可见的情况下工作。隔离或隐藏被排除的几何体对我来说并不总是奏效,因为我非常依赖遮罩(masks)与锚点(anchors),某些笔触可能会泄漏到不想要的图层。

贴图(Texturing)
在贴图工作流中,我非常多地使用锚点(anchors)和 3D 纹理投影(3D texture projection)。这让我形成了如下的图层堆栈顺序:我以一个在所有贴图集上实例化的中灰或黑色图层开始。它最终不可见,但在遮罩之间充当填充,以防有间隙或半透明过渡。接下来是一个紫色文件夹,名为 Height(高度),其中只包含带有高度与法线信息的图层。我可以把它们分到里面的独立文件夹;不过,在 Height 文件夹顶部,我放了一个带锚点的空填充图层,这个图层的每个通道都设为 Pass Through(穿透)。这让我能获取下面所有图层的高与法线信息,稍后在每个生成器(generator)的 Micro Details(微观细节)槽位中使用。

堆栈顶部的最后一个是名为 AS_Adjust(红色)的文件夹——它包含通用效果,如锐化、AO 压暗和边缘提亮,应用于整个集。这些效果让纹理更有深度与对比。


我当时对握把设计并不确定,它上面有一些明显的花卉纹饰叠加在鳞片图案上,但要做几个 3D 设计、把它们贴合表面并烘焙下来,太费时间了。于是我决定改用 Textures.com 上现成的高度 alpha(height alpha),这样我无需额外工作就能即时切换。
我收集了一些,用平面投影(planar projection)方法把它们投影到网格上,让它们在另一侧保持同一位置,然后只需沿握把移动它,并通过在填充层里替换遮罩,就能从一个设计切换到另一个。平面投影,以及其他 3D 投影方法(尤其是 Warp),让你无需真正编辑纹理文件,就能把 alpha 形变贴合到表面。你只需旋转一个变换 gizmo(变换手柄)来匹配角度,或像用 Lattice 修改器那样移动控制点。

不过,鳞片图案的处理方式不同。这次我在 Textures.com 上没找到合适的,所以不得不在 Substance 3D Designer 里自己制作。其实相当简单:基础形状由抛物面(paraboloid)alpha 制作;斜率(slope)只是一个线性渐变乘算(linear gradient multiply),而散布(scattering)则是通过 RGBA Merge 和 Split 节点完成的。这样,我无需额外遮罩就能排布鳞片——你只需从图案形状做一个 alpha,用 RGBA Merge 合并,再变换它来分布鳞片,然后拆分回来只使用 RGB 数据,而不用 alpha。


两张贴图被导入 Substance 3D Painter:高度与法线,这次通过 UV 投影。在 Substance 3D Designer 链条的末端,我使用了 Normal 节点,它让我能控制法线贴图的强度——我不得不重新导出几次,好让结果在视觉上得体,又不会过度影响生成器的遮罩。底部的星形是从高多边形网格烘焙到一块平面上的,然后以同样的方式在 Substance 3D Designer 中编辑。

其余的装饰——尤其是猎犬追逐鹿、枪管叶片和盾牌——由概念图提供。我把它们通过 Substance 3D Designer 里类似的设置,以便控制强度、通过 Normal Vector Rotation(法线矢量旋转)节点控制法线方向、平铺(tiling)和 alpha 遮罩。盾形纹饰完全是在 Substance 3D Designer 中制作的。

我在这个项目里使用的材质相当干净、未经处理,因为我想强调这把武器奢华、崭新的观感。木质贴图的逻辑如下:积水和污垢容易堆积的地方更暗;相互摩擦的地方更亮;空腔存在的地方会积尘。把我的 Height 文件夹中的高度与法线信息加入 Metal Edge Wear(金属边缘磨损)、Dirt(污垢)或 Mask Editor(遮罩编辑器)等生成器,帮助我实现了想要的效果。

金属材质也用同样的方法处理。这里要提一个重要点:我们只能通过看最终引擎内渲染来准确测量颜色值,因为引擎有色彩校正(color correction)和渲染模型。Substance 3D Painter 可能显示得不一样;这就是为什么我总是使用设为 Pass Through 混合模式的校正图层(correction layers),配合 Levels、HSL 或 Contrast/Luminosity(对比度/明度)滤镜,来调整漫反射(Diffuse)、高光(Specular)或光泽度(Glossiness)。有些东西在 Substance 3D Painter 里看起来完美,但在引擎集成后,你可能会发现某些数值有偏差或过于暗淡。

绳索贴图依赖从高多边形烘焙的贴图。

LOD
所有其他网格部件都以同样的方式完成。这里要讨论的最后一个话题是 LOD(细节层级)。资产在每个细节层级上应当看起来一致,这就是为什么我们经常把一些重叠的部件(比如螺栓)烘焙下来——它们在远处可以减少几何体,但仍需出现。这里有一个围巾的例子:它被烘焙到枪托网格上,这样当武器远离相机时,我们可以移除它的几何体。为了让围巾网格与其在枪托上的投影拥有相同的纹理,我主要使用 3D 贴图投影方法而非 UV,并用克隆(Clone)工具把一个采样区域复制到另一个区域。

渲染(Rendering)
所有渲染都在 CryEngine 中完成。我用 Marvelous Designer 制作了一些自定义布料网格,并用 Substance 3D Designer 和 Painter 贴图。布光由 3-4 盏聚光灯(主光 key、轮廓光 rim、补光 fill)组成,目的是制造强烈的阴影并突出高光反射。所有相机都有相对较低视野(FOV),并带有强烈的景深(Depth of Field)效果。

此外,我还制作了一个武器架(weapon rack)资产。

后期处理
后期处理在 Photoshop 中完成。我绘制了一些自定义暗角(vignette)遮罩,让它们的形状更贴合某些武器姿态。我使用 Color Lookup(颜色查找)和 Color Balance(色彩平衡)调整图层为渲染添加氛围,而偏移曝光(offsetting the exposure)给我一种雾效,在我看来让画面「会呼吸」。它还会提升最暗的值,所以我不会有纯黑区域。你可以对比一下武器在没有任何后期处理(除暗角外)的游戏实际画面中的样子:


结语
非常感谢你的阅读。希望你能从中找到一些有用的技巧,并运用到自己的工作中。


评论留言