全部模型资源
  • 全部模型资源
  • - 交通工具
  • - 动物昆虫
  • - 场景\道具模型
  • - 建筑模型
  • - 植物模型
  • - 武器模型
  • - 独家资源库
  • - 科幻模型
  • - 角色动画库
  • - 角色模型
  • 游戏开发知识博客

《猎杀对决1896》Nitro Express 武器皮肤制作解析

Nitro Express Checks and Balances 武器皮肤整体渲染图
《猎杀对决 1896》Nitro Express 步枪皮肤最终渲染展示

导语

大家好!我是 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 概念设计参考板
由 Ivo Nies 绘制的概念设计,确立了仪式感军用武器的方向

Nitro Express Checks and Balances

Nitro Express Checks and Balances 的概念图由我的同事 Ivo Nies 绘制。这把步枪是我们为《猎杀对决 1896》最新「Road To Hell」活动打造的军用奢华套装中的一件武器,套装还包含其他几把武器。

设计方向是打造一把仪式感的军用武器:它应当使用高身份感的材料,如黄金或异域木材,但依然可以略带磨损,带有一些徽记、部队纹章或军衔,使用纹饰装饰,并以绳索系带点缀。

在动手之前,我总会先制作一块参考板,把武器拆解成各个组件,就像真实的枪械由多个部件组合而成那样。它并不局限于某一种特定的武器型号、颜色或材质;通常我会加入一些类似的东西,以便挑选最合适的方案。这里很重要的一点是:我会做笔记,并把参考板整理得井井有条,方便其他美术师跟随。

Blender 中按制作阶段划分的集合结构

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

Nitro Express 白模(Blockout)阶段

白模(Blockout)

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

使用 Hard Ops 进行布尔建模

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

布尔切割器(Cutters)细节
几何节点驱动的导出设置动画演示
几何节点自动 UV 展开与导出流程演示

要把资产导出到引擎,我们使用一个特殊的内部插件,它作用于一个空物体(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 中,它其实并不那么直观,需要几次变换迭代才能在武器上显得得体。

枪身贝壳状装饰元素建模
装饰元素 rib/ring 细节

我从一个简单的形状开始,就像上面截图里的紫色段,然后镜像它、并把它变形,使形状从侧面可见,同时仍保留枪管与机匣相接处的圆形中心。如果我把它保持为笔直对称的形状,它要么会被机匣网格遮挡,要么两枪管之间的距离会太宽。

绿色和蓝色肋条的数量、它们的轮廓以及扭转值也调整了好几次,以确保没有可见的网格交叠,且一切看起来自然。红色环也是如此——它们共享相同的厚度与轮廓,但倾斜与半径不同。所以这里我同时用到了几何节点和修改器。

绳索/皮带缠绕变形动画演示
绳带阵列+曲线变形动画演示

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

绳索/皮带缠绕变形动画演示
枪托主体 Shrinkwrap 建模

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

星形装饰附近枪托厚度控制
高模 ZBrush 布尔雕刻动画演示

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

导入 CryEngine 后的游戏内检查效果

高多边形(High Poly)

在这个阶段,我把细分网格与雕刻部件在 Zbrush 中合并。另外需要提一句:所有绳索都是在 Subdiv(细分)中制作的,因为之后我需要展开 UV 并绘制它们,以便把有方向性的绳索纹理传递(transfer)到合并后的低多边形网格上。

方法很简单:你从 Blender 里取出布尔结构,导入 ZBrush,在一个文件夹(folder)里重建同样的结构。借助 Live Boolean(实时布尔)选项,你可以非破坏性地操控操作数,包括整套雕刻工具集。我偏爱这个方法,因为它给了我惊人的多边形上限(polycount),同时还能保持不错的视口性能;我可以手动调整、打磨某些区域,并受益于 polygroups(多边形组)和 Polish by Features(按特征抛光)选项。

如果我不确信哪种方案最好,我随时可以用 Morph Target(形变目标)和 Layers(图层)把网格存入内存,做一些调整,再用 Morph Target 笔刷手动绘制回去;或者降低某个图层的不透明度,让想要的效果以不到满强度的程度呈现。我在所有工作中都使用这个方法,但这次轻松得多,因为这个资产相当干净,不需要重度破坏边缘或缝合接缝。

ZBrush 雕刻动画演示

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

3D 装饰合并到 ZBrush

围巾的底部是用几何节点制作的:一个简单矩形平面,配合 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),让我可以把这块作为一个边缘笔直的矩形来展开。

低模减面与 Decimate 权重绘制
重拓扑后重绘权重,让减面器在玩家不易察觉的区域削减更多几何体

武器被划分为 5 个贴图集(texture set),主要是因为游戏内的配件(attachment)设置:每一个实心部件在被替换时(如果武器有变体)都可能被替换。所以它包含枪管(蓝)、护木(橙)、机匣(绿)、绳索(黄)和枪托(深青)。

我做了一些测试性的 UV 打包,来衡量各贴图集之间的纹素密度(texel density)。除护木外,其余大致相同——护木的数值略高,可以容纳更多内容。这就是为什么绳索的皮革带与单股绳子被纳入了这个集。这里有一个要点:尽管枪托原本计划用 4×2K,但在贴图过程中发现,由于细节很小,它需要更高分辨率。因为它以正方形格式展开,所以变化不大。

然而,如果我是在贴图完成后,才把一个矩形展开的枪管升级到完整正方形,就可能会破坏某些纹理缩放与平铺(tiling)。这就是为什么我建议在最终 UV 打包与烘焙之前,先做些测试性贴图。

将武器划分为 5 个贴图集

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

装饰绳带 UV 展开

其余部分就相当常规了:复制对称部件以节省 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(微观细节)槽位中使用。

贴图层堆栈与 Height 文件夹动画演示

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

AS_Adjust 调整效果动画演示
顶部红色文件夹包含锐化、AO 压暗、边缘提亮等通用效果
握把高度 alpha 切换动画演示

我当时对握把设计并不确定,它上面有一些明显的花卉纹饰叠加在鳞片图案上,但要做几个 3D 设计、把它们贴合表面并烘焙下来,太费时间了。于是我决定改用 Textures.com 上现成的高度 alpha(height alpha),这样我无需额外工作就能即时切换。

我收集了一些,用平面投影(planar projection)方法把它们投影到网格上,让它们在另一侧保持同一位置,然后只需沿握把移动它,并通过在填充层里替换遮罩,就能从一个设计切换到另一个。平面投影,以及其他 3D 投影方法(尤其是 Warp),让你无需真正编辑纹理文件,就能把 alpha 形变贴合到表面。你只需旋转一个变换 gizmo(变换手柄)来匹配角度,或像用 Lattice 修改器那样移动控制点。

平面投影(Planar Projection)动画演示

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

鳞片状图案在 Substance 3D Designer 中制作
鳞片状图案细节

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

Substance 3D Painter UV 投影动画演示
高度与法线以 UV 投影导入,并用 Normal 节点控制法线强度

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

来自概念艺术的装饰(猎犬逐鹿、盾牌)
其余装饰由概念艺术提供,经 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)工具把一个采样区域复制到另一个区域。

LOD 围巾烘焙到枪托
围巾烘焙到枪托网格,远处相机可移除其几何体而保持外观一致

渲染(Rendering)

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

CryEngine 渲染效果
全部渲染在 CryEngine 完成,3-4 盏聚光灯营造强阴影与高光

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

武器架资产
额外制作的武器架展示资产

后期处理

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

Photoshop 后期处理
游戏内无后期处理(仅暗角)对比

结语

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

评论留言