引言
大家好!我叫 Matvey Meleshko,是一名自学成才的环境艺术家(Environment Artist),目前正在寻找游戏开发行业的首份工作。我最早在高中的时候就开始考虑从事游戏开发,当时我学习学院派绘画与构图的基础,准备报考建筑类大学。不过人生走了另一条路,我最终进入了材料科学专业,主攻艺术方向的设计。

石膏头像素描写生

建筑透视与构图练习
从大学一年级起,我开始自学 3D,大部分时间都在 Blender 里度过,但进步并不明显。在学习过程中,我加入了一个艺术家社群,从中获得了大量宝贵的反馈与建议,也完成了不少教程和课程。我的道具质量有了明显提升,但我希望通过在更大规模的项目中历练来继续成长,于是决定专注于环境艺术。
我意识到环境艺术过于复杂,很难完全靠自学掌握,我需要一位导师。在寻找学习机会时,我看到了 Evgeniy Vegera 的一期反馈直播,并发现他搭建了一个专门帮助艺术家提升技能的平台。
我选定了一个概念图,主动联系了 Evgeniy,告诉他我想在他的指导下完成这个项目。我之所以被 Bart 的概念图吸引,是因为它独特地融合了非洲与中东建筑,并加入了科幻元素。这让我立刻联想到《星球大战》(Star Wars)的宇宙,尤其是塔图因星(Tatooine)的景观——那是我从小就很喜欢的世界。

Ember Bazaar 最终场景渲染
Ember Bazaar 集市
这个项目的主要目标,是在一位资深行业专业人士的指导下,学习环境艺术流程(environment art pipeline)的每一个阶段,并真正理解一套真实的制作工作流。除了概念图本身,我还把《星球大战:亡命之徒》(Star Wars Outlaws)和《刺客信条:幻景》(Assassin’s Creed Mirage)作为主要视觉参考。
我还研究了星战主题乐园,并学习了北非与中东地区的真实建筑。由于我的学术背景是材料科学,我有机会接触真实材料样本,这帮助我更好地理解材料的结构,以及老化、氧化和形变的过程。
一开始,我先确定了整个环境中用到的主要材料,并按其用途进行归类。之后,我制定了一份分步制作计划,梳理自己将如何推进整个项目。

遮挡阶段(Blockout)
遮挡模型(blockout)在 Maya 中制作,主要形状都按照概念图搭建。我还做了一个简易布局,以便更好地理解建筑的内部结构。



完成遮挡后,我开始细化各个建筑形体,这些形体在整个制作过程中不断演进。最具挑战性的任务之一,是用 Marvelous Designer 模拟布料遮阳棚,因为这是我第一次使用这款软件。模拟完成后,我施加了风场模拟以获得更自然的褶皱,随后把网格导出到 Zbrush 进行进一步雕刻。


UV 展开
接着,我在布料边缘添加了一些平面,作为后续的撕裂口。我把所有内容导出到 RizomUV。由于基础 UV 已经在 Marvelous Designer 中生成,我只需调整它们以匹配目标纹理密度(texel density,10.24px/cm)。之后我创建了第二套 UV,在布料选定区域切分 UV 壳,并把边缘平面放入这些区域。这第二套 UV 后续会作为 alpha 集使用。

随后我把所有内容导出到 Substance 3D Painter,用 Alpha 笔刷绘制了一张遮罩,以便之后在 Unreal Engine(虚幻引擎)中混合布料材质。这里的关键是要确保着色正确——布料与附着平面必须保持为一个焊接了顶点的单一网格。

否则,你的布料破片与边缘平面就会变成下图这样:

在 Unreal Engine 中,我为布料创建了一个专用材质,它支持第二套 UV 通道,并允许应用 alpha 遮罩。

每组遮阳棚我只用两种材质,就实现了逼真的撕裂布料边缘和破洞。我也尝试过用 Chaos Cloth 来模拟遮阳棚,说实话,效果很糟糕,于是我寻找了更简单的替代方案。SimpleGrassWind 节点通过数学函数偏移物体的世界位置(World Position),来模拟轻微的摇曳。我非常喜欢这种直白且对美术友好的做法,后来把它整合进了我的主材质,用来驱动整个场景中的植被和其他布料元素。
不过我在草地上遇到了一个问题——整个网格都在动,看起来一点都不真实。我花了好几天寻找解决方案,结果发现它和那个节点本身一样简单:使用顶点色(Vertex Color)遮罩。

在这里,我提取绿色通道,并让材质只在绿色通道被绘制的地方应用世界位置偏移。然后在网格绘制(Mesh Paint)工具里,我只需把不应移动的区域在绿色通道上涂成黑色。下面是用遮阳棚做的一个示例,我也把支撑结构涂成了黑色。这样一来,所有物体都能平滑摆动,而且运动可以被精确控制。

建筑
主要建筑构件同样在 Maya 中细化。在后续会用到顶点绘制的区域,我尽量保持拓扑相对干净。建筑的放射状设计节省了大量时间,因为它让我可以高效地复制并排布结构周围重复的元素。

我还把 Blender 列为建模的辅助软件。Maya 处理非常密集的几何体和高模网格时并不总是很顺手(这可能跟我当前版本有关),所以我用 Blender 来处理重型模型。

建筑的下半部分在 ZBrush 中雕刻,随后进行减面(decimate),以打破网格那种过于均匀、”电脑生成”的边缘。我还用移动(Move)笔刷调整了某些区域。在我看来,这种材质尤其容易显现自然磨损,尤其是建筑下部——那也是人们最常接触的地方。这一部分还使用了平铺材质、顶点绘制和第二套 UV 通道。
在 Unreal Engine 中组装出建筑的初版后,我意识到它看起来孤立、与周围环境脱节。我用混元 3D(Hunyuan 3D)生成了背景建筑,但没能把集市很好地融入环境,所以它仍像是被直接贴到背景上。此外,生成建筑的质量说实话相当粗糙,材质也显得很平,金属偏暗,吧台的几个元素也显得不够完善。

材质
那时,我决定认真着手改善材质,并把建筑融入环境。所有材质都完全在 Substance 3D Designer 中制作。遗憾的是,其中一个灰泥变体的文件丢失了,不过我可以展示其余的。

我认为这是最成功的一版材质,因为它很好地捕捉到了灰泥的分层质感,将粗糙、噪点的表面与更光滑、打磨过的区域形成对比。它的主要灵感来自《星战外环》中的一款材质,我又结合北非与中东真实建筑的参考做了进一步细化。


下一款材质,其 Substance 3D Designer 节点图不幸也丢失了,它的灵感来自 Jones Armellini 在《星战外环》中出色的作品,以及 Aleksey Kirsanov 为《半条命》(Half-Life)制作的高细节灰泥材质。我分析了他们作品的独特之处,并试图把这些特质融入自己的材质中。

下面展示的是这几位艺术家的作品。


在制作下一款材质时,我的目标是让之前创建的灰泥基底老化、开裂、被侵蚀。

木质材质经历了很多次迭代。尽管它看起来是个相当直接的材质,但要做出令人信服的效果,却成了最困难的任务之一。我还制作了一个上漆的变体,之后配合顶点绘制用在了主要的装饰性木质构件上。

这些节点图很乱,我先道个歉——我知道它们远算不上易读。这款材质的关键就是这一小簇节点。如果我接入一张纯黑的遮罩,所有漆面都会消失,露出底下的原木。由于遮罩本身也可以替换,这款材质就变得非常通用。

道具
完成材质后,我开始制作道具。陶罐大概是这个项目里我最喜欢的资产。我在 UV 壳上使用了径向对称:简单造型被分成四分之一块,更复杂的则对半分。我遵循了传统的高模转低模(high-poly to low-poly)流程并烘焙细节。这种做法省下了大量 UV 空间,让我达到了 15.62 px/cm 的纹理密度(2048×2048 贴图集)。


纹理绘制
接下来是纹理阶段。在制作纹理时,我主要关注反照率(Albedo)和粗糙度(Roughness)通道。色彩信息应当丰富且有层次,包含大量的微妙色彩变化,这样资产才会显得更可信。在艺校时,老师教我要在一个物体内部同时寻找暖色和冷色,这种对比让表面更有视觉吸引力,也更真实。
我还在纹理中加入了微妙的渐变。由于环境设定在沙漠,道具的下半部分会变得更亮,并逐渐偏向沙色,从而更自然地与地面融合。我还用了另一种技巧:用光照贴图(Lightmap)来驱动饱和度。长期受阳光直射的表面会逐渐失去饱和度、显得褪色,这为资产增添了额外的环境叙事。


这个终端可以被视作一个英雄资产(hero asset),因为我设想它是玩家会与之交互的物体。它可以作为任务地点,或环境叙事的起点,揭示剧情相关角色的信息——比如屏幕上显示的一名赏金目标。这个资产是随着整个环境一起演进的。主显示屏保持不变、沿用传统的烘焙流程,而支撑支架则被重建为中模(mid-poly)几何体。
对于支架,我采用了 AI 辅助的起稿。我先生成了支撑结构的概念图,再用混元 3D(Hunyuan 3D)创建 3D 模型,最后在生成的网格之上手动重建几何。我知道 AI 工具在许多艺术家那里仍有争议,但我认为这种方式能更快地开发复杂造型,同时仍能让最终资产在逻辑上完整完成,而不牺牲视觉质量。


对于支架本身,我使用了重叠 UV 来节省纹理空间,单个支撑部件只需沿一个轴镜像即可。

屏幕材质是跟着一个教程做的。这个着色器模拟了真实的 RGB 子像素,我还在材质中混合了一张反照率(Albedo)贴图,并用可调节的标量参数驱动自发光(Emissive)输出,以控制屏幕亮度。

添加细节
之后,我回过头来重做木质吧台。我在 ZBrush 中雕刻了单块木板,把它们烘焙为独立资产、绘制纹理,并沿着吧台全长摆放,通过旋转和镜像来避免明显的重复。吧台本体也被雕刻、打包进自己的贴图集并烘焙。虽然吧台最终的纹理密度相对较低,但我本来就无意单独为它绘制独特纹理。
相反,我只使用了它的法线贴图(Normal Map),并与之前创建的平铺木质材质混合。我用蓝色漆点了几块木板,因为我想引入一个色彩重音,自然地吸引玩家注意并微妙地引导他们穿行环境。蓝色漆出现在吧台上、主建筑的纹饰中、前景木板里、花朵上,以及终端机上。
我以大约 70/30 的比例分布上漆木板,因为我觉得这种不规则的排布比完全等距摆放更耐看。把所有东西导入 Unreal Engine 后,我意识到吧台还需要更好地与周围环境融合,它的各个部件也显得有些脱节。

我把整个吧台打包进一套独立的 UV,用于 RGB 遮罩。借助这些遮罩,我在木板下部加了积灰,在吧台下方引入微妙色彩变化以增加纵深,并用单一颜色高亮选定的边缘。这些相对简单的调整让资产显得整体感强了许多。

大门看起来也相当朴素,于是我决定直接从星战主题乐园借鉴一个想法——在拱门上添加雕刻铭文。我用乐园的一张真实参考,通过 AI 生成了一张 alpha,用简单的布尔(Boolean)运算把它刻进网格,在 ZBrush 中细化边缘,最后用减面(Decimation)收尾。


正如前面提到的,我没能逐个优化每一个资产,所以把这块网格保留为 Nanite 资产。它最终大约 63,000 个三角形,这肯定高于我通常的目标,但我实在没有足够时间去进一步优化。
楼梯的灵感来自《地平线:西之绝境》(Horizon Forbidden West)的概念图。我非常喜欢它的设计,觉得能很自然地融入这个环境。我做了几处修改,雕刻了部分台阶和其他楼梯构件,然后重复了我在吧台上用过的方法。通过旋转和镜像部件,我在占用远更少 UV 空间的同时获得了独特的外观。我用加入青铜元素的方式来区分材质,然后把所有内容打包进一套带 RGB 遮罩的专用贴图集。


我还重新设计了吧台的顶部,用通风设备和缆线等额外细节打破它过于干净的轮廓。这些是带有独立纹理的单独网格。我很喜欢这种做法,因为它让我可以通过创建模块化细节部件,为大型结构添加高层次的细节,而这些部件之后也能复用到其他资产上。

氛围
我已经讲完了道具和主建筑,但项目最重要的方面仍然是环境整体的情绪与氛围。街道也经历了多次迭代。我首先做了一个简易布局,确保主建筑能恰当地融入整体构图。我的目标是捕捉到一个真实集市的氛围——玩家可以在那里购买装备、补给和各种物品。

我制作了第一套用于拼装不同类型建筑的模块化套件。这些资产相当简单,映射到平铺材质,用来搭建周边城镇。然而,我偏离原始概念太远了,这成了我最大的失误。集市建筑太过突出——它色彩鲜明、细节丰富,而周边房屋几乎全是单色砂岩。
阳台太暗,阳台、门和窗的比例也明显不真实。玩家穿过门洞、望向窗外或踏上阳台时,会感到不舒服。我决定把这些元素彻底重新设计。

我开始识别概念图的关键视觉元素。是什么定义了它的风格?是什么营造了情绪、赋予它独特的视觉识别度?我特别喜欢对木材、天线和各种附件的运用——它们能带来额外的色彩变化,打破砂岩建筑的单调。我还基于自己的理解加入了装饰图案,灵感来自《刺客信条:幻景》trim sheet(修剪纹理)里的几处纹饰。
这些图案引入了我在整个场景中已经确立的同一种蓝青色重音。我还在 trim sheet 中加入了一些木质细节。下图展示了我规划的 trim sheet 布局,包括基于预期镜头角度的大致比例。

规划完毕后,我在 Maya 中创建 trim sheet 的基础几何体,并在 ZBrush 中通过雕刻细化。重要的是要开启笔刷环绕(wrap)模式,这样雕刻在烘焙时仍能完美平铺。

之后,我把所有内容烘焙到一张平面上,并在 Substance 3D Painter 中绘制纹理。

我非常依赖 EMC3D — Game Art 的优秀教程。UV 壳未必非要匹配 trim sheet 的精确比例——它们经常被缩放和调整以贴合资产,不过要避免过度拉伸。我真的很享受使用 trim sheet 的过程,希望未来能把更多环境艺术流程围绕它来搭建,因为它是高效添加细节的极强工具。
大约在这段时间,我还发现了 Unreal Engine 中的 Cable Actors(缆线 actor)。(后来在渲染时我可没少跟它们较劲——不过当时我还不知道,于是兴冲冲地在环境中到处布置缆线。)之后是一大堆添加次要道具的常规工作。没有它们,环境会显得太空。我添加了通风设备、技术装置,以及许多其他小资产。
Megascans 帮了大忙——我用了植被,以及长椅、小工具、石块等道具类资产。我还添加了更多悬挂布料,这正是中东市场常见的、用来遮挡强烈阳光的元素。和市场遮阳棚一样,这些布料也是在 Marvelous Designer 中用缝合(Sew)工具和压力模拟来生成缝合处的真实褶皱。我在 ZBrush 中雕刻了几块石头,通过旋转、镜像和缩放网格,用它们铺出石径。最后,我用 Unreal Engine 的植被工具(Foliage Tool)把草和石头分布到整个场景中。


改进场景
那时我以为项目已经完成了——但我知道它还能更好。最先跳出来的是过强的对比度。如果你把场景临时切换成灰度,这一点会格外明显。强烈的对比本身不是坏事,但必须被小心控制,否则环境就会失去整体感。尤其是背景,不应该持续吸引玩家注意。
为了解决这个问题,我开始用主着色器中之前暴露出的”颜色曝光”(Color Exposure)参数来平衡背景。我也调整了木材和其他材质,让它们的整体明度尽可能更一致。这削弱了刺眼的对比,让场景显得统一得多。我还回过头处理了几个木质资产,雕刻了额外细节并引入更自然的色彩变化。
不过,大部分工作都投入到了重新设计地面。最初那种巨大岩石构造的想法根本说不通——城市街道中央摆着巨石,显得完全格格不入。我把岩石和楼梯都移除了。我没有单纯依赖植被工具来散布草和石头,而是手动细化它们的摆放,形成更可信的簇群。沿着街道边缘,石头会自然堆积在建筑之间的沙地里,草也理应在那里生长。
如果看到孤立的灌木从铺装石路中央冒出来,会显得很怪。我还创作了一个小型环境构图,替换掉原先摆放通风设备的位置。那个区域的木板后来被复用到周边建筑中。它们在 ZBrush 中雕刻、重度减面、展 UV 并烘焙。下面是高模版本与减面后低模的对比。

我还对门做了一些改进,把它们变成双面资产以增加变化。到了这个阶段,每一分钟都很宝贵。

当时场景的视图:


我决定用 Niagara 粒子效果进一步增强场景。我不算 VFX 艺术家,所以跟着几个教程走,主要是调整参数来贴合我的环境。我添加了风效,以及一个模拟热空气上升导致空气微微闪烁的热扭曲(heat distortion)效果。这些效果被放在背景和通风设备周围。在视频里比在静帧中更容易感受到它们。


做完这一切后,我做了最终的灯光调整。我选择了一张天空符合我想要的情绪的 HDRI,微调了平行光(Directional Light),并调整了泛光(Bloom)、指数高度雾(Exponential Height Fog)等设置。我还在吧台周围使用了局部雾体积来增加大气纵深。实际上,这些雾体积只是一些几何体网格——圆锥或其他形状——上面套了半透明不透明度的材质。
后来,我发现了出色的虚拟相机(Virtual Camera,VCam)工具。我花了一整天来正确配置它,但绝对物有所值。这个应用可以让你直接用手机实时录制相机运动。我真的在自己宿舍里走来走去录制电影感镜头,就好像真的穿行在环境中一样。下图展示了单次拍摄自动生成了多少关键帧——相机记录下了每一个动作。

现在回到 Cable Actors。在渲染时,它们开始变得完全不可预测,因为 Unreal Engine 会在每次渲染时重新模拟它们。我使用电影渲染队列(Movie Render Queue,MRQ)来渲染项目,因为它允许添加高级渲染设置,在尽量减少瑕疵的同时显著提升画质。
下面是我的 MRQ 设置。关于每个选项都有大量优秀的 YouTube 教程详细讲解,我就不逐个参数展开了。

为了消除缆线在渲染时的不可预测行为,我调整了抗锯齿(Anti-Aliasing)设置,具体是引擎预热帧数(Engine Warm Up Count)。这个参数决定了 Unreal Engine 在记录最终输出前会先渲染多少帧,从而让所有模拟稳定下来。它不仅适用于 Cable Actors,也适用于热扭曲和风等效果。(对于 Niagara 系统,预热可以在系统内部直接开启——我把它设到了最大值 9.96 秒。)经过一些试验,我发现预热帧数设为 120 能得到稳定的结果。
我还花时间试验了空间采样数(Spatial Sample Count)和时间采样数(Temporal Sample Count)。空间采样主要提升静态几何体的画质,让图像更锐利干净;时间采样则主要影响运动元素,比如动态布料、风和热扭曲。我很惊讶地把时间采样数只提高到 3–4,差别就那么大——动画立刻变得平滑自然得多。但代价是渲染时间:在我配置相当普通的电脑上,一段 40 秒的电影感镜头花了将近两个小时才渲染完。
即便如此,我还是觉得最终渲染可以更好。从我做第一张道具渲染起,我就一直很喜欢后期处理。这个项目也是我第一次接触 DaVinci Resolve。此前我的所有后期都在 Photoshop 里完成,但 Resolve 被证明是更强大、更全面的工具。给打算用 DaVinci Resolve 的人的一个建议:把图像渲染成 EXR 格式。尽管文件大得多,但它保留了更广的动态范围和更多的曝光信息,让 Resolve 在调色时能充分利用这些数据。
我在示波器(scopes)上注意到的第一件事,是画面里红色过多。虽然环境设定在沙漠,但暖色仍压过了整体观感。我把色温(Temperature)值降到负区间,然后创建单独的遮罩来改善吧台周围的灯光,调整高光(Highlights)、泛光等参数,还给了灯具更强的泛光效果。降低色温让本就偏蓝的天空转向了靛蓝色调。为修正这点,我用 HSL 限定器(HSL Qualifier)把天空的颜色隔离出来,再用窗口(Window)工具细化选区,这样校正就不会影响到场景里其他蓝色元素,比如上漆木板或装饰性建筑纹样。
最后,我对整体图像施加了微妙的锐化,并在吧台周围区域加了轻微模糊以增强纵深感。完整的后期流程我就不在此展开了,网上已有数不清的优秀 DaVinci Resolve 教程,而且这款软件上手出奇地友好。我只提一点:电影感镜头我非常依赖跟踪遮罩(tracked masks),并根据每段序列中相机的运动来细化它们。
下面的截图展示了整体后期处理工作流的样子:

结语
这篇文章变得相当长——希望它没太枯燥,也希望真的有人一路读到了这一段。这个项目几乎花了我整整一年才完成,大约 360 天。当然,我并非每天都在做它,期间我还在完成大学的本科学位,所以可用时间相当有限。
从这个项目里学到的最大教训,说出来简单得令人意外:别做这么大的环境。说真的。在同一个场景上耗费如此长的时间,极其消耗人。如果你刚开始接触环境艺术,我建议选择更小的概念,重质而非重量。
我想给初学者唯一的建议是:永不放弃,持续进步。你看到了这个项目早期阶段与最终成果之间的巨大差距。别害怕重做你的作品,永远依赖好的参考——它们是你最重要的工具之一。相信自己,也别害怕按自己的节奏来。


评论留言