植被图集这件事说简单也简单说难也难。简单在于它的构成无非是叶片、枝干、杂草、藤蔓这几类元素难在于一旦要把它做成能直接丢进引擎里铺满整个场景的资产就得同时兼顾形态多样性、Alpha通道干净度、法线细节、性能开销和视觉统一性。我做过几套用于开放世界场景的植被图集从最初一张图只有孤零零几株草到后来一套图集能撑起整片森林的地面层次中间踩的坑基本都集中在看起来没问题但进引擎就露馅这个环节上。这篇内容就是把这套流程从头到尾拆开讲一遍重点放在那些文档里不会写、但实际制作中一定会遇到的地方。1. 先想清楚图集到底要解决什么问题1.1 图集不是把植物拼在一起那么简单很多人第一次做植被图集理解就是把几株草、几片叶子摆在一张图上。这个理解不算错但只停留在表面。图集真正的价值在于用一张贴图承载一组在视觉上协调、在技术上统一、在使用时可以自由组合的植被元素。它要解决的核心矛盾是场景里需要大量不同形态的植被来避免重复感但引擎的Draw Call和显存又不可能允许你为每一株草单独准备一套材质。所以图集的本质是一次批处理——把原本需要多张独立贴图才能表达的多样性压缩进一张图里同时保证每个元素单独拿出来用的时候不露怯。这就要求你在制作阶段就考虑到元素之间的间距、边缘留白、Alpha通道的干净程度以及不同元素在色调和光照响应上的一致性。我见过不少新手做的图集单看每一株草都挺好看但拼到一张图上之后有的偏黄有的偏蓝有的叶片厚实有的薄如纸片放进场景里就像是从不同星球采集来的样本。这就是没有在制作初期统一视觉基准的后果。1.2 图集在引擎里的实际使用方式决定了制作标准要理解图集该怎么做得先理解它在引擎里怎么用。以Unreal为例植被图集通常配合植被工具Foliage Tool或者程序化植被生成来使用。每个植被实例会从图集中采样一个区域通过UV偏移来选取不同的元素。这意味着图集中每个元素必须占据一个规整的矩形区域否则UV采样会串到隔壁元素上元素之间必须有足够的透明边距防止mipmap生成时相邻元素互相渗色所有元素的光照方向必须一致否则同一片草地上会出现有的叶子朝左亮、有的朝右亮的诡异效果。这些约束条件直接决定了你在Substance Designer里的节点布局和输出设置。如果你只是按做一张好看的贴图的思路来做最后大概率要返工。1.3 一套图集应该包含哪些元素根据我的经验一套用于温带森林地面的植被图集比较合理的元素构成是这样的元素类型数量建议用途说明阔叶草4-6种地面主要覆盖形态要有高矮胖瘦的变化细叶草3-4种增加层次感穿插在阔叶草之间蕨类叶片2-3种用于林下阴影区域形态要舒展藤蔓/匍匐植物2-3种用于岩石和树干边缘的过渡杂草穗2-3种增加垂直方向的视觉趣味地面碎叶3-4种铺在地面增加细节密度这个配比不是固定的但核心思路是既有大面积覆盖的基础元素也有点缀用的细节元素。如果全是草铺出来会像草坪如果全是碎叶又会显得杂乱无章。2. 在Substance Designer里搭建可复用的植被生成框架2.1 为什么不用手绘而用程序化生成手绘植被贴图当然可以而且质量上限很高。但问题在于当你需要调整叶片的弯曲程度、叶脉的密度、边缘的锯齿感时手绘意味着从头再来。而程序化生成的优势在于参数化控制——你可以把叶片的长度、宽度、弯曲度、叶脉密度都做成可调参数改一个数值就能生成一整组变体。更重要的是程序化生成天然适合做批量变体。你可以在一个Graph里通过Seed随机化一次性输出几十种形态略有差异的叶片然后从中挑选最合适的几个放进图集。这个效率是手绘没法比的。当然程序化生成也有它的局限过于复杂的有机形态比如扭曲的藤蔓用节点搭建会很痛苦。我的做法是混合流程——基础形态用程序化生成复杂的局部细节用手绘或者外部雕刻导入。这样既保留了灵活性又不至于在节点里死磕。2.2 叶片生成的核心节点链路一个可复用的叶片生成框架核心链路大致是这样的Shape Splatter基础轮廓 → Directional Warp方向扭曲制造弯曲 → Slope Blur边缘柔化 → Curve叶脉曲线 → Blend叶脉叠加 → Gradient Map高度转法线 → Output输出这里每一步都有讲究。Shape Splatter负责生成叶片的基础形状你可以用几个椭圆或者自定义形状作为输入通过Scatter和Rotation控制分布。Directional Warp是让叶片产生自然弯曲的关键它的原理是用一张噪声图作为方向引导把原本笔直的叶片往某个方向推。Slope Blur用来柔化边缘但注意不要过度否则叶片会失去锐利的轮廓感。叶脉部分我习惯用Curve节点配合Spline来画因为Curve节点可以精确控制曲线的走向和粗细变化。主叶脉和侧叶脉分开做主脉粗、侧脉细侧脉从主脉分出的角度要有变化不能像梳子一样整齐排列。2.3 用参数暴露实现一套Graph出多种变体这是整个框架里最值得花时间优化的部分。我的做法是把所有影响形态的关键参数都暴露成Input Parameter包括Leaf_Length叶片长度Leaf_Width叶片宽度Bend_Amount弯曲程度Vein_Density叶脉密度Edge_Serration边缘锯齿强度Color_Variation色调偏移然后在Graph里用Seed节点驱动随机化。每次调整Seed就会生成一组形态不同的叶片。你可以批量输出几十张然后在Photoshop或者Substance Designer的2D视图里挑选。注意Seed随机化的时候要控制范围。如果随机范围太大生成的叶片会五花八门反而失去了统一性。我的经验是把形态参数的随机范围控制在±15%以内色调偏移控制在±5%以内。2.4 从单株到图集的拼版逻辑单株叶片做好之后下一步是把它们拼到一张图集上。这一步看起来简单实际上很容易出问题。首先是分辨率分配。假设你的图集是2048×2048要放20个元素平均每个元素能分到大约200×200的空间。但实际分配不能平均——阔叶草需要更大的空间来表现细节碎叶可以小一些。我的做法是按元素的重要性分配主要草叶给256×256次要元素给128×128碎叶给64×64。其次是间距控制。元素之间至少留4-8像素的透明边距这是为了防止mipmap生成时相邻元素互相渗色。如果你用的是Unreal还要考虑Alpha通道的Dilation——在输出前对Alpha通道做几个像素的扩张避免边缘出现黑边。最后是排列顺序。我习惯把同类元素放在一起比如所有阔叶草放在左上区域所有细叶草放在右上区域。这样在引擎里做UV偏移的时候可以按区域来选取逻辑更清晰。3. 让植被活起来的关键法线、AO与高度图的协同3.1 高度图不只是用来生成法线的很多人做植被贴图的时候高度图只是用来生成法线生成完就扔了。但实际上高度图还有几个重要用途生成AO用Height to AO节点可以从高度图快速生成环境光遮蔽让叶片的凹陷处自然变暗驱动材质混合在引擎里可以用高度图来控制不同材质层的混合比如叶脉部分更光滑、叶面部分更粗糙制作视差效果如果你要做视差材质高度图是必不可少的输入。所以高度图的质量直接决定了后续好几个环节的效果。我的建议是高度图的分辨率至少要和法线图一致不要为了省事用低分辨率的高度图去生成法线那样细节会丢失。3.2 法线细节的层次感怎么来植被法线最容易犯的错误是太平。叶片的法线如果只是简单的起伏渲染出来会像塑料片。真实的叶片有主脉、侧脉、叶面微凹凸三个层次的细节。我的做法是分三层来做法线主脉层用Curve节点画出主叶脉转成高度后生成法线强度调高侧脉层用更细的Curve画出侧脉强度中等微凹凸层用Perlin Noise或者Cell Noise生成细密的表面起伏强度调低。三层叠加的时候要注意混合模式。主脉和侧脉用Max或者Add混合微凹凸用Overlay或者Soft Light混合。这样出来的法线才有层次感近看有细节远看不杂乱。3.3 AO通道的生成与优化AO通道在植被渲染里的作用是增强叶片的体积感。没有AO的叶片看起来是扁平的有了AO之后叶脉的凹陷、叶片的卷曲都会自然显现出来。在Substance Designer里生成AO最直接的方法是用Height to AO节点。但直接生成的AO往往太硬边缘过渡不够柔和。我的做法是在Height to AO之后接一个Blur节点半径控制在2-4像素让AO的过渡更自然。另外AO的强度也要控制。太强的AO会让叶片看起来脏太弱又起不到作用。我的经验值是主脉区域的AO强度在0.6-0.7叶面区域的AO强度在0.2-0.3。这个可以通过在Height to AO节点里调整Depth参数来实现。3.4 粗糙度与金属度的植被专用设置植被的粗糙度设置有一个基本原则叶面光滑、叶脉粗糙。这是因为叶面通常有蜡质层反光较强而叶脉部分因为凸起和纹理反光较弱。在Substance Designer里我通常用高度图来驱动粗糙度高度高的地方叶脉粗糙度高高度低的地方叶面粗糙度低。具体做法是用Histogram Scan节点把高度图重新映射到0.3-0.7的粗糙度范围。金属度对于植被来说基本是0除非你要做特殊的风格化效果。但有一个例外如果叶片上有露水或者雨滴可以在那些区域给一点点金属度配合低粗糙度来模拟水珠的反光。4. 颜色与色调让图集在场景里不突兀4.1 植被颜色的三个层次一套好看的植被图集颜色上要有三个层次基础色叶片的主体颜色通常是中等饱和度的绿色变化色叶片边缘、叶尖的颜色变化可能是偏黄、偏红或者偏褐枯败色少量叶片带有的枯黄或褐色增加真实感。这三个层次的比例大概是7:2:1。如果全是基础色图集会显得单调如果枯败色太多又会显得荒凉。在Substance Designer里实现这个层次我通常用Gradient Map配合Mask来做。先用噪声生成一个Mask然后用Gradient Map把Mask映射到不同的颜色区间。这样出来的颜色过渡自然不会像手涂那样生硬。4.2 色调统一性的检查方法图集做完之后一定要做色调统一性检查。方法很简单把图集缩小到25%或者更小然后眯着眼睛看。如果这时候图集看起来是一块均匀的绿色说明色调统一性没问题如果能看到明显的色块差异说明某些元素的色调偏了。另一个方法是把图集放进引擎在实际光照环境下观察。有时候在Substance Designer里看着没问题进引擎之后因为光照的影响色差会被放大。我的习惯是在引擎里搭一个简单的测试场景放几个植被实例用不同的光照角度观察确认色调没有明显偏差。4.3 季节变化与色调变体如果你做的图集要用于有季节变化的场景可以考虑做色调变体。方法是在Substance Designer里用HSL节点调整色相、饱和度和明度生成春季、夏季、秋季三个版本。春季的色调偏嫩绿饱和度稍低夏季的色调偏深绿饱和度最高秋季的色调偏黄褐饱和度降低。这三个版本可以共用同一套法线和AO只是颜色不同所以在引擎里切换季节的时候只需要换颜色贴图性能开销很小。5. 输出设置与引擎对接的实操细节5.1 输出分辨率和格式的选择植被图集的输出分辨率取决于你的使用场景。如果是用于近景植被建议2048×2048或者更高如果是远景植被1024×1024就足够了。我通常做两套一套高分辨率用于近景一套低分辨率用于远景在引擎里通过LOD切换。格式方面颜色贴图用PNG或者TGA法线图用TGAAlpha通道单独输出一张灰度图。有些引擎支持把Alpha通道打包进颜色贴图的第四个通道这样可以减少一张贴图的开销。Unreal就支持这种打包方式具体做法是在输出的时候把Alpha连接到颜色贴图的A通道。5.2 Alpha通道的Dilation处理这是植被图集最容易出问题的地方。如果你的Alpha通道边缘没有做Dilation在引擎里渲染的时候叶片边缘会出现黑边或者白边。原因是mipmap生成的时候透明区域的RGB值会渗入到不透明区域。解决方法是在输出前对颜色贴图做Dilation处理。Substance Designer里有专门的Dilation节点可以设置扩张的像素数。我的经验是扩张4-8像素具体取决于图集的分辨率和元素之间的间距。注意Dilation要在Alpha通道生成之后、输出之前做。如果先输出再在Photoshop里做Dilation很容易因为压缩导致边缘质量下降。5.3 在Unreal里配置植被材质的要点图集做好之后在Unreal里配置材质有几个关键点材质域设置为Masked植被材质必须用Masked模式用Alpha通道来控制透明度Two Sided勾选叶片是双面的必须勾选Two Sided法线贴图设置为Normal Map在Texture设置里把法线贴图的Compression Settings改为Normal Map关闭sRGB法线图、粗糙度图、AO图都要关闭sRGB只有颜色贴图开启sRGB。另外如果你要做风吹效果可以在材质里用World Position Offset配合Simple Grass Wind节点来实现。这个节点的原理是用顶点着色器驱动叶片的摆动性能开销很小效果也不错。5.4 性能优化的几个实用技巧植被是场景里最吃性能的元素之一所以优化很重要。几个实用的技巧控制图集数量一套场景用的植被图集不要超过3-4张否则Draw Call会很高使用LOD近景用高模远景用低模或者Billboard限制过度绘制叶片之间的重叠不要太多否则Overdraw会很严重用Masked而不是TranslucentMasked模式的性能开销比Translucent小很多除非你需要半透明的叶片效果。6. 那些只有踩过才知道的坑6.1 图集元素之间的渗色问题这个问题我在前面提过但值得再强调一次。渗色的根本原因是mipmap生成时相邻元素的像素互相混合。除了留足间距和做Dilation之外还有一个技巧在元素之间填充与元素边缘相近的颜色而不是填充纯黑或者纯白。这样即使有轻微渗色也不会太明显。6.2 法线方向不一致导致的阴阳脸如果图集里的元素是在不同的Graph里生成的很容易出现法线方向不一致的问题。表现就是同一片草地上有的叶子朝左亮有的朝右亮。解决方法是统一所有元素的光照方向——在Substance Designer里确保所有法线图都是基于同一个光照方向生成的。我的习惯是统一用左上45度作为光照方向。6.3 过度依赖程序化导致的塑料感程序化生成虽然方便但如果不加控制很容易做出塑料感很强的植被。原因是程序化生成的形态过于规整缺少自然界的随机性和不完美。解决方法是在程序化生成之后手动添加一些不规则的细节比如叶片的破损、虫咬的痕迹、不均匀的色调变化。这些细节不需要多但能显著提升真实感。6.4 忽略引擎光照环境导致的色调偏差在Substance Designer里看着颜色正好的图集进引擎之后可能会偏色。这是因为Substance Designer的预览环境和引擎的光照环境不同。解决方法是在制作阶段就在引擎里搭一个测试场景定期把图集导入进去观察效果。不要等到全部做完再导入那样发现问题就晚了。6.5 图集分辨率与元素数量的平衡图集分辨率是有限的元素数量越多每个元素能分到的空间就越小。如果元素太多每个元素的分辨率就会低到无法表现细节。我的经验是2048×2048的图集元素数量控制在16-24个之间。超过24个每个元素的细节就会明显不足少于16个图集的利用率又太低。7. 从图集到场景实际铺装的经验分享7.1 植被密度与分布的控制图集做好之后在场景里铺装的时候要注意密度控制。太密会显得拥挤太疏又会露出地面。我的经验是近景区域的植被密度在60%-80%中景在40%-60%远景在20%-40%。这个密度可以通过引擎的植被工具来调节。分布方面不要均匀铺满要有疏密变化。可以用噪声图来驱动密度分布让植被在某些区域密集、某些区域稀疏这样更自然。7.2 不同植被元素的搭配比例图集里的不同元素在铺装的时候要有搭配比例。我的习惯是阔叶草50%细叶草25%蕨类10%藤蔓5%杂草穗5%碎叶5%这个比例不是固定的要根据场景的具体需求调整。但核心思路是基础元素占大头点缀元素占小头。7.3 与地形材质的融合植被和地形材质的融合是一个容易被忽略的细节。如果植被的颜色和地形颜色差异太大会显得很突兀。解决方法是在制作植被图集的时候参考地形材质的色调让植被的基础色和地形色保持在一个色系里。另外可以在植被材质里加入地形颜色采样让植被的根部颜色和地形颜色自然过渡。7.4 风吹效果的参数调校风吹效果是植被渲染的点睛之笔但参数调不好会显得很假。几个关键参数Wind Speed控制摆动的速度太快像台风太慢像静止Wind Intensity控制摆动的幅度太大像水草太小看不出效果Wind Direction控制摆动的方向要和场景的整体风向一致。我的经验值是Wind Speed在0.5-1.5之间Wind Intensity在0.1-0.3之间。具体数值要根据植被的类型和场景的氛围来调。8. 一些提高效率的实用工作流建议8.1 建立可复用的节点模板如果你经常做植被图集建议把常用的节点链路保存成模板。比如叶片生成链路、法线生成链路、AO生成链路都可以保存成单独的Graph下次直接调用。这样能省下大量重复劳动的时间。Substance Designer支持导出Graph你可以把做好的Graph导出成.sbs文件下次直接导入。我自己的习惯是建一个植被工具包文件夹里面放着各种常用的Graph模板用的时候直接拖进来改参数就行。8.2 批量输出与自动化Substance Designer支持Batch Output可以一次性输出多个变体。具体做法是在Graph里用Seed节点驱动随机化然后在Batch Output里设置输出的数量。这样你可以一次性生成几十个变体然后从中挑选最合适的。另外Substance Designer还支持Python脚本可以用来自动化一些重复性的操作比如批量重命名、批量导出、批量调整参数。如果你有编程基础可以写一些简单的脚本来提高效率。8.3 版本管理与迭代记录植被图集的制作往往需要多次迭代所以版本管理很重要。我的做法是每次重大修改都保存一个新版本并在文件名里标注修改内容比如FoliageAtlas_v03_调整了草叶弯曲度.sbs。这样如果改坏了可以随时回退到之前的版本。另外建议在Graph里用Comment节点标注每个区域的功能方便自己和他人理解。特别是当Graph变得很复杂的时候清晰的标注能省下大量排查问题的时间。8.4 与团队的协作规范如果你是在团队里做植被图集协作规范很重要。几个建议统一命名规范比如Foliage_Grass_A、Foliage_Fern_B让所有人都能看懂统一输出设置分辨率、格式、压缩设置都要统一避免因为设置不同导致效果不一致共享节点模板把常用的Graph模板放在共享文件夹里方便团队成员调用定期同步进度植被图集的制作周期比较长定期同步可以避免重复劳动和方向偏差。9. 关于风格化植被图集的几点补充9.1 风格化与写实的差异风格化植被和写实植被在制作思路上有本质区别。写实植被追求的是细节的丰富性和自然的不规则性而风格化植被追求的是形态的概括性和色彩的鲜明性。在Substance Designer里做风格化植被可以减少噪声的使用多用纯色块和硬边缘。叶片的形态可以更夸张比如更尖、更圆、更弯。颜色可以更饱和对比可以更强烈。9.2 风格化植被的图集布局风格化植被的图集布局和写实植被类似但元素之间的间距可以更小因为风格化植被的边缘通常更清晰渗色问题不那么严重。另外风格化植被的元素数量可以更少因为每个元素的视觉冲击力更强不需要太多变体来避免重复感。9.3 风格化植被在引擎里的渲染设置风格化植被在引擎里通常用Unlit或者简单的Lambert渲染不需要复杂的PBR材质。这样可以大幅降低性能开销同时保持风格的统一性。如果你要做风格化的场景建议把植被的材质简化到最低限度把性能留给其他更重要的元素。10. 最后聊几句实际项目中的取舍做植被图集这件事最大的挑战不是技术而是取舍。你总是想要更多的元素、更高的分辨率、更丰富的细节但图集的空间是有限的引擎的性能也是有限的。所以你必须不断地问自己这个元素真的需要吗这个细节在最终画面里能看到吗这个分辨率是不是可以再降一点我的经验是先做加法再做减法。初期可以尽量多地生成元素和细节然后在实际铺装的时候观察哪些元素用得多、哪些用得少哪些细节在最终画面里根本看不到。然后根据观察结果做减法把不必要的元素和细节砍掉把空间留给真正重要的部分。另外不要追求一次做到完美。植被图集是一个迭代的过程第一版做出来之后在实际场景里用一用发现问题再改。改个三五版是很正常的。重要的是建立一个可迭代的工作流让每次修改都能快速验证效果而不是每次都要从头再来。我在最近一个项目里做了一套温带森林的植被图集从第一版到最终版改了六次。最大的改动是把原本分散在四张图集里的元素合并到了两张同时把每张图集的分辨率从2048提升到了4096。这个改动让Draw Call减少了一半同时细节反而更好了。所以有时候少即是多关键是要找到那个平衡点。