☰
Substance Designer植被图集制作全流程:从程序化生成到引擎验证
2026/9/30 9:40:26 网站建设 项目流程

植被图集这件事,在材质圈里一直是个分水岭。刚入行那会儿,我以为做树叶就是找张好看的叶子照片,抠出来往模型上一贴就完事。结果第一次把成品丢进引擎,美术总监看了一眼就问我:你这树叶怎么像纸片糊上去的?风一吹是不是还得哗哗响?那一刻我才意识到,植被图集远不是"贴图"两个字能概括的,它牵扯到Alpha通道的精度、法线的朝向、粗糙度的层次、以及整个图集在引擎里的采样效率。Substance Designer之所以成为这个环节的主力工具,核心就在于它能把"随机性"和"可控性"这两件看似矛盾的事捏到一起——你既要有自然植被那种不规则的生长感,又得保证每一片叶子在UV里规规矩矩、不越界、不糊边。

这篇内容我打算把整套植被图集的制作链路从头到尾捋一遍,从图集规划、叶片单体生成、法线与粗糙度推导,到最终打包导出和引擎验证。适合已经摸过Substance Designer基础节点、但一做植被就翻车的朋友,也适合想从"拼照片"转向"程序化生成"的材质从业者。我不会只给你一串节点连线,而是把每一步为什么这么做讲清楚,包括我自己踩过的那些坑——比如Alpha边缘发灰、法线接缝、图集打包后采样模糊这些老问题,都会给出具体的排查思路和参数区间。

1. 植被图集到底在解决什么问题

1.1 从"一张叶子一张图"到"一张图集打天下"

很多人刚开始做植被,习惯一片叶子导出一张贴图,觉得这样清晰、好管理。但真到了场景里,一棵树几百片叶子,如果每片都独立贴图,Draw Call会直接爆炸,显存也会被大量重复的小图撑满。植被图集的核心思路,就是把多种叶片、多种朝向、多种破损状态全部塞进一张(或少数几张)大图里,让引擎用同一份材质实例去渲染成百上千个面片。

这背后的逻辑其实和游戏里的UI图集、角色装备图集是一回事:合并采样源,降低状态切换开销。但植被比UI麻烦的地方在于,叶片有大量透明区域,Alpha通道的处理直接决定了边缘质量和性能。图集里如果Alpha分布不合理,要么边缘锯齿严重,要么透明区域浪费了大量像素填充率。

我一般会把一张图集控制在2048×2048或4096×4096,具体看项目目标平台。移动端倾向2048,PC和主机可以上4096。图集内部按网格切分,比如8×8的格子,每格256×256,一片叶子占一格或两格。这样在UV映射时,每片叶子的UV都落在固定区间内,方便程序化摆放和LOD切换。

1.2 图集规划里最容易被忽略的三个约束

第一个约束是Alpha的膨胀边界。叶片贴图在采样时,如果UV刚好落在叶片边缘,GPU的双线性插值会把透明区域的RGB也混进来,导致边缘发灰或发黑。解决办法是在叶片周围留出2到4像素的"出血区",把叶片的颜色向外膨胀(Dilate)出去。Substance Designer里有专门的Dilate节点,但很多人忘了在图集打包之后再做一次全局膨胀。

第二个约束是法线的切线空间一致性。图集里每片叶子的法线都必须是切线空间法线,而且朝向要统一。如果你从不同来源拼叶子,有的法线是物体空间、有的Y轴朝上有的朝下,进引擎后光照会乱成一团。我的做法是在Designer里统一用Normal节点从高度图生成,保证所有叶片的法线基准一致。

第三个约束是Mipmap的衰减。图集在远处会触发Mipmap,如果叶片之间间距太近,低级别Mip会把相邻叶片的颜色混进来,出现"鬼影"。所以图集里每片叶子之间要留足空隙,通常至少8像素,重要叶片可以留16像素。

1.3 一张合格植被图集的验收标准

我给自己定的验收标准有这么几条:Alpha边缘在放大到400%时不出现明显灰边;法线在引擎里打光时叶片正反面过渡自然,没有硬接缝;粗糙度能区分出叶面蜡质感和叶背的哑光感;整张图集在Mipmap第3级时仍然能辨认出叶片轮廓。这几条听起来简单,但真做起来,每一条都能卡住不少人。

提示:验收时一定要把图集放进实际引擎场景里看,不要只在Designer的2D视图里判断。Designer的预览和引擎的采样、光照、Mip策略都有差异,很多问题只有进引擎才暴露。

2. 叶片单体的程序化生成思路

2.1 用形状节点搭出叶片的"骨架"

做叶片单体,我不建议一上来就画。程序化的好处是可复用、可批量变体。我的常规做法是先用Polygon或Shape节点搭出叶片的基础轮廓,再用Warp、Directional Warp做边缘的起伏。叶片的形状本质上是"一条主脉加若干侧脉"驱动的,所以我会先画一条从叶柄到叶尖的渐变,作为主脉的权重,然后用这个权重去驱动边缘的弯曲。

具体节点链路上,我通常用Linear Gradient 1做纵向渐变,配合Radial Gradient做叶尖的收窄,两者用Blend叠加,得到基础叶形。接着用Directional Warp配合一张噪声,让边缘产生自然的锯齿和波浪。这里噪声的强度要控制好,太强叶子会像被虫啃过,太弱又显得太"塑料"。我一般把噪声强度放在0.05到0.12之间,频率中等偏高。

叶柄部分单独用一条细长的形状叠加,注意叶柄和叶片的连接处要平滑过渡,不能有硬边。我见过不少人叶柄和叶片是两块分开的图形,结果Alpha一合并就出现断裂。

2.2 叶脉的层次感靠高度图而不是颜色

新手常犯的错误是把叶脉直接画在颜色图上,结果叶片看起来扁平。正确的做法是叶脉主要靠高度图表达,颜色图只做轻微的明暗辅助。主脉的高度要比叶面高出一点,侧脉再低一些,形成三级层次:主脉 > 侧脉 > 叶面。

在Designer里,我会用几条不同粗细、不同方向的Gradient Line组合出叶脉网络。主脉用一条较粗的线,侧脉用多条细线按角度分布。这里可以用Tile Sampler或者Mirror节点来批量生成对称的侧脉,效率比手动画高得多。侧脉的角度和间距要有随机变化,完全对称会显得假。

高度图的灰度值我一般这样分配:叶面基准0.5,侧脉0.6,主脉0.75,叶柄0.65。这样从高度图生成法线后,叶脉的立体感刚好,不会过于夸张。

2.3 颜色变化要模拟真实叶片的"不完美"

真实叶片没有一片是纯色的。向阳面和背阴面、老叶和嫩叶、健康区域和枯萎边缘,颜色都不一样。我在颜色阶段会叠三层:基础色、渐变变化、局部斑驳。

基础色用一张低频噪声调出黄绿到深绿的过渡。渐变变化用纵向渐变模拟叶尖偏黄、叶基偏深。局部斑驳用高频噪声配合Levels,做出一些枯黄的小斑点。这三层用不同的混合模式叠加,基础色用Normal,渐变用Multiply,斑驳用Overlay或Soft Light。

这里有个经验:叶片的颜色饱和度不要拉满。很多人做出来的叶子绿得发亮,像塑料。真实叶片的饱和度其实偏低,尤其是背光面。我通常会把最终颜色的饱和度压到70%左右,再在引擎里靠光照补回来。

2.4 用HSL和渐变映射做批量变体

一片叶子做完了,怎么快速生成几十种变体?我的做法是用HSL节点配合渐变映射。把基础叶形和高度图固定,只对颜色层做HSL偏移,色相偏移±15度,饱和度±20%,明度±10%,就能得到一批看起来"同种但不同株"的叶片。再配合渐变映射,把绿色映射到秋天的黄橙色系,就能快速产出一套秋季变体。

这种批量变体的思路在项目里非常实用,尤其是需要做季节变化或者不同生态环境的时候。你不需要重新做形状,只需要调整颜色参数,效率能提升好几倍。

3. 从高度图推导法线与粗糙度的关键细节

3.1 法线生成不是点一下Normal节点就完事

Substance Designer里从高度图生成法线,用的是Normal节点,但参数设置有讲究。默认的强度(Intensity)往往偏大,生成的叶脉法线过于锐利,进引擎后高光会炸。我一般把强度调到0.5到0.8之间,具体看高度图的对比度。如果高度图本身对比就很强,强度还要再降。

另一个关键是法线的采样精度。Normal节点内部会对高度图做差分计算,如果高度图的分辨率不够或者有噪点,法线会出现麻点。解决办法是在生成法线之前,先对高度图做一次轻微的模糊(Blur),把高频噪点压掉,但注意不要模糊过头,否则叶脉细节就没了。我通常用Blur HQ Grayscale,半径1到2像素。

还有一点,法线生成后要检查接缝问题。如果叶片是左右对称的,法线在对称轴上可能出现一条硬线。这是因为差分计算在边界处不连续。解决办法是在生成法线前,把高度图做一次Mirror,让边界连续,生成法线后再裁回来。

3.2 粗糙度要区分叶面和叶背

叶片的粗糙度不是均匀的。叶面通常有一层蜡质,粗糙度偏低,大约0.3到0.4;叶背的绒毛多,粗糙度偏高,0.6到0.8。如果整片叶子用同一个粗糙度,光照会显得很"平"。

我的做法是用一张遮罩区分叶面和叶背。这个遮罩可以从高度图或者法线的朝向推导出来——叶背通常对应法线朝下的区域。用Normal节点的输出做点积,或者直接用高度图的梯度方向判断。得到遮罩后,用两个不同的灰度值分别填充叶面和叶背,再叠加一点噪声做微观变化。

粗糙度图里还可以加入一些"破损"信息,比如虫蛀区域粗糙度偏高,枯萎边缘粗糙度也偏高。这些细节虽然小,但在近景特写时能明显提升真实感。

3.3 环境光遮蔽(AO)在叶片上的特殊处理

叶片的AO和普通物体不一样。普通物体的AO是凹处暗、凸处亮,但叶片很薄,正反面的AO会互相影响。如果直接用常规AO生成,叶片会显得很脏。

我的处理方式是:AO只做叶脉和叶柄的局部遮蔽,叶面大面积保持接近白色。叶脉的凹槽处稍微压暗,叶柄和叶片的连接处压暗,其余区域不动。这样进引擎后,叶片整体明亮,只有细节处有自然的阴影层次。

具体参数上,AO的强度我一般控制在0.15到0.25之间,不要超过0.3。超过0.3叶片就会显得灰蒙蒙的,失去通透感。

3.4 高度图、法线、AO三者的先后顺序

这三者的生成顺序不能乱。正确的链路是:先做高度图,再从高度图生成法线和AO。因为法线和AO都依赖高度信息,如果先做法线再改高度,法线就白做了。

我见过有人先画颜色,再从颜色反推高度,结果叶脉的立体感完全不对。颜色是表面反射的结果,高度是几何结构,两者不能互相替代。一定要先把几何结构(高度)定下来,颜色和粗糙度都是在这个结构上"涂"上去的。

4. 图集打包与UV布局的实操要点

4.1 用Tile Sampler和Transformation 2D做批量摆放

图集打包的核心是把多个叶片单体按网格摆放到一张大图上。Substance Designer里可以用Tile Sampler配合Transformation 2D来实现。Tile Sampler负责按行列复制,Transformation 2D负责每个实例的旋转、缩放、偏移。

我的常规参数是:8×8网格,每个格子256×256,叶片在格子内居中,缩放控制在格子的80%到90%,留出边缘空隙。旋转角度我一般给±15度的随机范围,让叶片朝向有变化,但不要完全随机,否则UV映射时会很麻烦。

这里有个坑:Tile Sampler的随机种子要固定。如果种子是随机的,每次重新生成图集,叶片的位置都会变,之前调好的UV映射就全废了。所以一旦布局确定,立刻把种子锁死,后续只改叶片内容不改布局。

4.2 Alpha通道的膨胀与边缘处理

图集打包完成后,Alpha的边缘处理是最后一道关。前面提到过,叶片周围要留出血区,但光留还不够,还要做膨胀。Designer里的Dilate节点可以对RGB做膨胀,但Alpha本身也需要处理。

我的做法是:先把所有叶片的Alpha合并成一张遮罩,然后用Dilate节点对整张图集的RGB做膨胀,膨胀半径2到4像素。膨胀之后,再用这张遮罩去裁剪RGB,保证膨胀只发生在叶片边缘外侧,不会污染叶片内部。

膨胀的颜色来源要选对。如果膨胀用的是叶片边缘的颜色,效果最好;如果用整张图的平均色,边缘会出现色差。Designer的Dilate节点有"Color Source"选项,选"Nearest"或者"Average"要看具体情况,我一般用Nearest,边缘过渡更自然。

4.3 UV布局与引擎采样的对应关系

图集做完,最终是要在引擎里用的。UV布局必须和引擎的采样方式对应上。如果引擎用的是标准的UV采样,那图集里每片叶子的UV区间要明确标注出来,方便美术在建模时对齐。

我通常会在图集旁边附一张UV索引图,标出每片叶子对应的UV范围(比如第3行第5列对应UV 0.25-0.375, 0.5-0.625)。这张索引图不导出到引擎,只是内部协作用。有了它,建模的人就知道该把哪片叶子的UV对到哪个区间,不会贴错。

另外,图集的边缘要留至少4像素的空白,因为引擎在采样时可能会因为Mipmap或者各向异性过滤而"溢出"到图集边界外。如果叶片紧贴图集边缘,采样时会出现边缘拉伸或者黑边。

4.4 导出格式与压缩策略

导出的时候,颜色图用sRGB,法线和粗糙度用Linear。格式上,PC项目我一般用TGA或者PNG做中间格式,最终进引擎前再转成平台支持的压缩格式。移动端用ASTC,PC用BC7,主机看具体平台。

Alpha通道的压缩要特别注意。很多压缩格式对Alpha的支持不好,会导致边缘质量下降。如果项目对边缘要求高,可以考虑把Alpha单独存一张图,用更高的压缩质量。或者用Alpha Test而不是Alpha Blend,这样对压缩的容忍度更高。

注意:导出前一定要在Designer里把图集的色彩空间设置检查一遍。颜色图如果误设成Linear,进引擎后会偏暗;法线如果误设成sRGB,光照会完全错乱。这个错误非常常见,而且排查起来很费时间。

5. 进引擎后的验证与常见翻车现场

5.1 边缘发灰、发黑的排查链路

边缘发灰是植被图集最经典的问题。排查的时候按这个顺序走:先看Alpha边缘有没有膨胀,再看Mipmap设置,最后看材质的混合模式。

如果Alpha没膨胀,边缘采样时会把透明区域的黑色混进来,导致发黑。如果膨胀了还发灰,那可能是Mipmap的问题——低级别Mip把叶片和背景混在一起了。解决办法是给Alpha通道单独设置Mipmap偏移,或者用Alpha Test配合较高的Cutoff值。

还有一种情况是材质的混合模式设成了Alpha Blend,但图集的Alpha是硬边(0或1),这样边缘会有半透明的过渡带,看起来发灰。这种情况要么改用Alpha Test,要么把Alpha的边缘做成渐变。

5.2 法线接缝与光照异常的定位

法线接缝通常出现在叶片的对称轴或者图集的格子边界。如果接缝在叶片内部,多半是高度图在对称轴处不连续导致的。如果接缝在图集格子边界,那是相邻叶片的法线互相干扰了。

定位方法是:在引擎里把法线图单独显示出来,放大看接缝位置。如果是高度图的问题,回Designer重新生成法线,生成前做Mirror。如果是格子边界的问题,检查图集里叶片之间的间距,加大到16像素以上。

光照异常还有一种可能是切线空间不匹配。如果模型导入引擎时切线空间设置和Designer生成法线时的假设不一致,光照会整体偏斜。这种情况要检查模型的切线导入设置,确保和法线的切线空间对齐。

5.3 远处Mipmap导致的"鬼影"与模糊

远处叶片模糊、出现鬼影,是Mipmap的典型症状。图集里叶片之间如果间距不够,低级别Mip会把相邻叶片的颜色混进来,形成鬼影。解决办法有两个:一是加大叶片间距,二是给图集设置合适的Mipmap生成策略。

我一般会在引擎里给植被图集的Mipmap做一点锐化,或者用"Sharpen"过滤。有些引擎支持Mipmap Bias,可以稍微偏移一下,让远处叶片更清晰。但注意不要偏移太多,否则会出现闪烁。

另外,如果项目支持,可以用Virtual Texture或者Streaming Texture来管理植被图集,这样远处叶片可以加载更低分辨率的版本,既省显存又减少鬼影。

5.4 性能与画质的平衡取舍

植被图集最终是要跑在实时的场景里的,性能和画质必须平衡。我的经验是:近景叶片用高分辨率图集,远景用低分辨率或者简化的图集。可以准备两套图集,一套2048给近景,一套512给远景,引擎根据距离切换。

Alpha Test的Cutoff值也要调。Cutoff太低,边缘保留太多,透明区域的Overdraw严重;Cutoff太高,叶片边缘会被裁掉,显得稀疏。我一般把Cutoff设在0.3到0.5之间,具体看叶片的Alpha分布。

还有一点,如果场景里叶片数量极大,可以考虑用Billboard或者Impostor技术,把远处的整棵树渲染成一张面向相机的贴图。这样能大幅降低面数和Draw Call,代价是旋转视角时会有轻微的"纸片感"。

6. 我踩过的几个典型坑与应对经验

6.1 图集打包后颜色变脏的问题

有一次我做完图集,在Designer里看颜色很正常,导出进引擎后整体偏暗、偏脏。排查了半天,发现是图集的色彩空间在导出时被改了。Designer默认的工作空间是Linear,但颜色图需要sRGB。导出时如果没勾选正确的色彩空间转换,颜色就会偏。

后来我养成了一个习惯:在Designer里给颜色图单独加一个"Color Space"节点,明确标记为sRGB,导出时就不会错。法线和粗糙度则保持Linear,不加转换。

6.2 叶片朝向不一致导致的光照错乱

早期做图集,我从不同项目里拼了几片叶子,结果进引擎后有的叶子亮、有的叶子暗,打光完全不对。原因是这些叶子的法线朝向不一致,有的Y轴朝上,有的朝下。

解决办法是统一法线基准。所有叶片的高度图都按同一个方向生成法线,Y轴统一朝上。如果某片叶子需要反向,不要翻转法线,而是翻转UV或者旋转模型。这样能保证图集里所有叶片的法线在同一个切线空间里。

6.3 Alpha膨胀过度导致的边缘"发胖"

膨胀是个双刃剑。膨胀不够,边缘发灰;膨胀过度,叶片边缘会"发胖",看起来比实际大一圈。我一开始为了保险,把膨胀半径设得很大,结果叶片边缘多了一圈半透明的"光晕"。

后来我把膨胀半径控制在2到3像素,并且膨胀后立刻用原始Alpha做一次裁剪,把膨胀超出叶片轮廓的部分切掉。这样既保证了边缘颜色,又不会让叶片变形。

6.4 图集分辨率与显存的权衡

4096的图集确实清晰,但显存占用也大。一张4096的RGBA图集,未压缩时是64MB,压缩后也有16MB左右。如果项目里有多套植被图集,显存很快就吃紧了。

我的做法是:按植被类型分图集,而不是把所有植被塞进一张。比如阔叶树一套、针叶树一套、灌木一套、草一套。每套图集控制在2048,这样显存压力小,而且不同植被可以用不同的材质参数,灵活性更高。

6.5 从Designer到引擎的迭代效率问题

最后说一个流程上的经验。很多人做植被图集,是在Designer里做完导出,进引擎看效果,不满意再回Designer改,再导出,再进引擎。这个循环很慢,一天改不了几次。

我的优化方式是:在Designer里把关键参数暴露成参数节点(Parameter),比如颜色偏移、粗糙度范围、膨胀半径。这样在引擎里如果发现小问题,可以先通过材质参数微调,不用回Designer重新导出。只有结构性的改动才回Designer。这个习惯能省下大量时间,尤其是项目后期频繁调优的阶段。

植被图集这个活儿,说到底是在"自然感"和"工程约束"之间找平衡。程序化生成给了你批量产出的能力,但真正决定质量的,还是你对叶片结构的理解和对引擎采样行为的预判。我做了这么多年,每次做新图集还是会有新的小坑冒出来,但只要把高度、法线、Alpha这三条线守住,大部分问题都能在排查链路里找到答案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询