Substance Painter 多材质合并 Texture Set 避坑指南
1. 先把账算清楚多材质到底该不该合并1.1 一个 Texture Set 到底管着什么刚接触 Substance Painter 的人容易把材质槽和Texture Set当成一回事其实差得挺远。导入模型时SP 会按模型上的材质分组来切分项目每一个分组生成一个Texture Set而每个 Texture Set 背后是一整套独立的贴图Base Color、Roughness、Metallic、Normal、Height、AO 各一份互不干扰。换句话说模型上有 6 个材质槽导入后就变成 6 个 Texture Set导出时会吐出来 6 套贴图。如果每个材质都按 2K 输出光 Base Color 就是 6 张 2K 图。这种默认行为在多数情况下是合理的——分件清楚、互不影响、改哪块动哪块。但代价也明摆着材质球数量上去、贴图数量上去、在引擎里同一个模型要拆成多个 Draw Call。所以才有合并这个需求。合并这件事本质就一句话把多个 Texture Set 收拢成一个让同一个模型的所有部分共用同一套 UV 空间和同一组输出贴图各个部分靠蒙版Mask来区分材质属性。1.2 合并带来的好处和必须付出的代价先说好处这部分很多人只知其一。最直接的收益是材质球数量锐减。原来一个角色拆了 8 个材质引擎里就有 8 个 Material Instance合并后变成 1 个材质管理、参数调试、版本同步的工作量直接砍到八分之一。对于一个项目里几十个资产来说这个收益是实打实的。其次是Draw Call 下降。同一个 Mesh 上如果只有一种材质通常就是一个 Draw Call排除多 Pass 的情况。分件越多Draw Call 越碎尤其在移动端或者大量物件同屏的场景里影响不小。第三是贴图管理成本。一个文件夹里 3 张图和一个文件夹里 24 张图出错概率完全不是一回事。贴图少了命名混乱、版本错配、漏导漏传这些低级问题会明显减少。再说代价这部分才是决定要不要做的关键。分辨率被平摊。这是最容易被忽视的坑。原来每个部件独占一张 2K像素面积是满的合并到一张 4K 之后所有部件分这 4096×4096 的像素。假设有 6 个部件、面积相近每个部件实际拿到的有效像素远低于原来的 2K。贴图总量没变但局部精度可能掉了一半以上。牵一发动全身。合并之后改一个部件的粗糙度可能要重新检查蒙版有没有串色。分开的时候互不干扰合并之后就得小心维护。烘焙成本上升。Texture Set 合并后必须重新烘焙烘焙是按 Texture Set 走的原来 6 次烘焙变成 1 次但分辨率更高时间未必省。1.3 三种典型场景我一般这么判断场景类型典型例子我的建议理由分件多、单件面积小、精度要求中等枪械配件、机械装置、道具箱强烈建议合并Draw Call 收益大精度损失可接受关键主件 大量装饰小件混在一起主角身体 服饰挂件谨慎考虑拆成两组主件需要高精度不该被小件稀释分件少2-3 个且面积接近简单的家具、单个道具视情况可合可不合收益有限维护成本反而上升判断的核心逻辑如果一个部件在画面上是视觉重点、需要精雕细节就不要让它跟一堆小件挤在同一张贴图里。还有一个折中方案值得考虑把模型按重要性分成两组主件一组给高分辨率杂项一组给低分辨率两组各自合并。这样既压了材质数量又保住了重点区域的精度。我在做角色类资产时经常这么拆。2. 动手前的三个准备动作2.1 UV 布局能不能共用这是第一道生死关合并能不能做九成取决于 UV。道理很简单一个 Texture Set 只有一套 UV 空间0-1 范围内不能有重叠否则同一块像素会被两个部件同时占用贴图必然打架。所以动手前先回建模软件里看一眼把所有部件的 UV 放在同一个 UV 空间里它们互相重叠吗如果模型的 UV 本来就是全局排布的所有岛互不重叠、共同铺满 0-1合并完全没问题直接进 SP 合就行。如果每个部件各自把 UV 铺满 0-1这是很多建模习惯导致的合并后必然重叠必须先在建模软件里重新排一遍 UV。重新排 UV 这件事说起来简单做起来烦。实际操作里我一般这么做在 3ds Max 里用 UVW Unwrap 把所有部件的 UV 打散用 Pack UV 或 Unfold 工具重新排布把大件放中间、小件塞缝隙尽量把 0-1 空间利用率做到 70% 以上。Maya 里用 UV Editor 的 LayoutBlender 里用 UV Packing 的 Margin 参数控制岛间距都行。有一个细节容易被忽略UV 岛之间要留足间距。合并后所有材质挤在一张贴图上如果岛间距太窄烘焙的 Dilation 扩边会互相侵占接缝处就会出现颜色渗漏。提示合并前一定要在建模软件里检查 UV 是否有重叠。SP 导入后如果检测到重叠 UV会在 Texture Set 上给出警告标记别忽略它。2.2 材质 ID 色怎么在模型端埋好蒙版要区分部件最稳的手段是Material ID / Color ID。这个东西需要在建模软件里提前埋好。以 3ds Max 为例流程大致是这样给模型的每个部件分配独立的 Material ID比如枪身是 1、握把是 2、弹匣是 3。建一个 Multi/Sub-Object 材质每个子材质设成一个高纯度、无光照干扰的纯色——红、绿、蓝、黄这种饱和度拉满亮度适中。关键一步把子材质的高光、反射、自发光全部关掉或者干脆换成 Unlit 类型。有高光的材质烘出来的 ID 图会带明暗渐变后面用 Color Selection 拾取颜色时会拾不准。如果材质色在 FBX 导出时容易丢失跨软件传递材质色确实不太可靠改用顶点色更保险。在 Max 里加一个 VertexPaint 修改器直接刷纯色导出 FBX 时勾选输出顶点色。到了 SP 的烘焙环节Color ID 通道有来源选项模型带顶点色就选顶点色只带材质色就选材质色。这一步我踩过坑早期为了省事只用了材质色结果从 Max 导 Blender 再导 SP颜色丢了烘出来的全是灰的白忙一场。顶点色虽然多几步但跨软件的稳定性好太多。有一点要注意ID 色的数量要提前规划好。不是随便给几个色就行颜色之间要拉开距离色相间隔大不然烘焙后再做 Color Selection 时相邻颜色容易被误判。我一般用红、绿、蓝、黄、青、品红这六种基础色打底不够再扩展。2.3 导入设置和烘焙通道清单导入模型到 SP 时那个Material Import Method的下拉框值得停一下看一眼。它决定了是按材质分 Texture Set还是按 UDIM 块分。如果目标是合并两种都能用——因为合并可以在导入后手动做。但如果你希望导入就得到一个 Set可以先选好合适的分组方式省一步操作。烘焙通道这块合并前后要求不太一样。合并后的 Texture Set 承担了所有部件的材质表达需要更完整的几何信息我通常烘这几项通道用途是否必须Normal细节法线基础中的基础必须Ambient Occlusion蒙版和叠加层常用必须Curvature边缘磨损、边角高光必须Position渐变、高度相关效果建议Thickness做半透明感、脏迹堆积可选Color ID / Material ID蒙版分区核心必须World Space Normal特殊方向性效果可选Color ID 一定要烘这是合并多材质时蒙版的主力。没有它就只能靠手绘蒙版硬画效率差一个量级。烘焙分辨率建议直接跟最终输出对齐别省。用 2K 烘完再放到 4K 贴图上用细节就糊了。注意合并 Texture Set 之后之前所有的烘焙结果全部作废必须重新烘焙。所以烘焙这件事安排在合并之后做别反过来。3. 合并 Texture Set 并重建材质层的完整流程3.1 在 Texture Set List 里做合并这是整个流程里操作最短、影响最大的一步。打开Texture Set List面板按住 Ctrl 把需要合并的几个 Set 全选上右键菜单里找到Merge Texture Sets点下去。SP 会弹一个确认问你合并后保留哪些信息确认就完成了。合并完成后Texture Set List 里只剩一个条目原来那些分件全归到这一个 Set 底下。这时候打开 Layer 面板你会看到原来各个 Set 的图层被堆到同一个堆栈里——这正是需要警惕的地方。如果合并前每个 Texture Set 都已经画了一堆图层合并后这些图层会互相覆盖。比如原来枪身的金属层和握把的皮革层现在都在一个堆栈里谁在上面谁说了算下面那层就被盖住了。我的做法是合并的最佳时机是项目刚导入、还没开始画的时候。这时候所有 Texture Set 都是空的合并干净利落。如果项目已经画到一半才发现要合并那就先做抢救逐个 Texture Set 把已完成的材质另存为 Smart Material或者干脆导出成贴图备用。合并 Texture Set。把 Smart Material 重新拖回图层堆栈然后给每个材质层加上对应的蒙版用蒙版限制它的作用范围。这个抢救流程我实际用过几次能用但麻烦。能提前决定的事别拖到后期。3.2 合并后必须重烘焙别心存侥幸很多人合并完看着画面还挺正常就直接往下做了这是个隐形陷阱。合并前每个 Texture Set 的烘焙是针对各自 UV 空间做的合并后 UV 空间变了、贴图尺寸可能也变了旧的烘焙结果和新 UV 对不上。表现出来就是蒙版位置偏移、曲率图错位、法线方向怪异。所以合并后的标准动作是打开Bake Mesh Maps窗口确认输出尺寸建议 4K因为要承载多个部件所有通道重新烘一遍。烘完检查一下 AO 和 Curvature这两张最容易看出对没对上——AO 的脏迹位置如果和模型对不上就是烘焙出了问题。烘焙时有个参数值得单独说Dilation扩边。合并后 UV 岛数量变多、间距变窄扩边值设小了岛边缘会露黑边。我一般设成自动模式或者至少 8-16 像素。这个参数在导出时还能再调但烘焙阶段设好更省事。3.3 用 Fill Layer 加几何蒙版铺第一层材质烘焙搞定之后进入正题怎么把不同材质用蒙版区分开。基本结构是这样的——每一个部件材质对应一个 Fill Layer每个 Fill Layer 挂一个 Black Mask蒙版里用几何信息把该部件的区域选中。具体操作走一遍点Add Fill Layer新建一个填充层。在 Properties 面板里设置这个层的材质属性Base Color 给个基础色、Roughness 拉到对应值、Metallic 按金属非金属设 0 或 1。右键这个层选Add Black Mask加一个全黑蒙版全黑意味着这个层当前不显示。选中这个蒙版点Add Effect加一个Color Selection。点开 Color Selection 的吸管在视口里点一下该部件对应的 ID 色——蒙版立刻就把这块区域刷出来了。这套流程走下来一个部件大概 30 秒。部件多的话做成一个模板反复用会更快。蒙版的来源不止 Color Selection 一种常用的还有Geometry Mask可以按 Material ID、UV、Position、Normal、Curvature 生成蒙版功能最全面。Material ID 那一项如果模型有材质索引直接选索引号就行比拾色还准。UV Selection直接选中某个 UV 岛生成蒙版。这个在按 UV 分件的情况下特别快——点一下 UV 岛整块就选中了。Mesh Selection按 Mesh 名称选适合模型分件命名规范的场景。实际操作里我经常混着用大面积分件用 UV Selection 或者 Material ID形状复杂的脏迹分界用 Color Selection边缘过渡用 Curvature 配合。3.4 手绘蒙版和 Polygon Fill 的配合几何蒙版能解决 80% 的问题剩下 20% 得靠手画。举个例子某块金属板的边缘要做出锈蚀过渡从边缘往内逐渐消失。这种渐变几何蒙版做不出来得手绘。工具选择上Polygon Fill和软笔刷是两个主力。Polygon Fill 适合有明确边界的区域——点出一圈轮廓内部一次性填满边缘干净利落比一笔一笔涂快得多。软笔刷适合需要渐变过渡的地方——硬度调低、不透明度压低一点一点叠出来。手绘蒙版有几个经验用白色画显示、黑色画隐藏反着来容易乱。养成习惯后闭着眼都不会错。经常切换视图检查。按 M 键可以只显示蒙版看一下哪些地方漏了、哪些地方多画了。画错了别急着撤销全部可以直接用另一种颜色在上面叠SP 的蒙版支持叠加混合黑的盖不住可以用更黑的白的同理。对称部件开对称。SP 有 Symmetry 功能能省一半工作量。但注意对称轴要和模型的对称轴对准不然画出来是歪的。还有一个提效技巧先用几何蒙版打个底再用手绘修边。别一上来就纯手画那是纯浪费体力。几何蒙版拿到 90% 的正确率手绘只处理剩下 10% 的边界效率差好几倍。3.5 蒙版的柔化、侵蚀和边缘修整蒙版画完不等于结束边缘处理决定了最终成品的高级感。边缘太硬——部件之间像刀切一样分界看起来假。处理办法是给蒙版加一个Blur Filter模糊半径设 1-3 像素具体看贴图分辨率和实际需要。模糊之后边界会有自然的过渡感材质之间像是自然衔接的。边缘太糊——过渡过宽边界不清。这时候用Levels Filter拉一下对比度把过渡带收窄或者用 Curvature 配合重新定义一个更锐利的边界。边缘有锯齿——在低分辨率下尤其明显。除了提高贴图分辨率也可以通过轻微的 Blur 缓解。4K 贴图上 1 像素的模糊基本看不见但能糊掉锯齿。对于磨损类的边缘效果我的常用组合是Curvature 生成的边缘蒙版 Blur 柔化 Levels 提对比。这三步组合出来的磨损带既有细节又有过渡比纯手绘自然得多。心得蒙版处理不要一次性做到完美。先搭好大结构把每个部件的材质区分清楚再回头统一处理边缘和细节。顺序反了会反复返工。4. 导出设置把通道压进一张图的正确姿势4.1 通道打包规则对照表合并 Texture Set 之后导出环节有个额外的好处可以吃通道打包。所谓打包就是把几张灰度图塞进一张 RGB 图的三个通道里减少贴图数量。AO、Roughness、Metallic 这三张灰度图是最常被打包的对象。不同引擎和管线的打包规则不一样用错了材质参数会整个错位。常见规则整理如下管线R 通道G 通道B 通道UE 常用打包OcclusionRoughnessMetallicglTF 金属粗糙度OcclusionRoughnessMetallicUnity 金属度工作流MetallicOcclusion视版本而定自定义管线自定义自定义自定义打包前务必确认目标引擎的读取顺序。我见过把 Metallic 塞进 R 通道但引擎按 G 通道读的情况结果所有金属件全是塑料感排查半天才发现是通道错位。SP 的导出窗口里有现成的 Preset 可选一般够用。如果目标管线不在 Preset 里就得自己写 Config。4.2 导出模板变量与命名导出文件名支持变量替换用好了能省很多手动改名的时间。常用变量$textureSetTexture Set 的名称$meshMesh 的名称$project项目名称$udimUDIM 编号用了 UDIM 的话我习惯的命名规则是$project_$textureSet_通道名比如Rifle_MainBody_BaseColor。这样导出后不用改一个字的文件名直接拖进引擎就行。导出 Config 本质是一个 JSON 文件结构大概是这个样子{ name: MyPacked_ORM, maps: [ { name: $textureSet_ORM, channels: [ { destChannel: R, srcChannel: R, srcMapType: DocumentMap, srcMapName: Occlusion }, { destChannel: G, srcChannel: G, srcMapType: DocumentMap, srcMapName: Roughness }, { destChannel: B, srcChannel: B, srcMapType: DocumentMap, srcMapName: Metallic } ], parameters: { fileFormat: png, bitDepth: 8, dithering: true } } ] }自己改 Config 的时候重点是destChannel和srcMapName的对应关系这两个弄反了就是灾难。改完记得存成新的 Preset别覆盖默认的。格式选择上也有讲究Base ColorPNG 用得多8 位够有 HDR 需求的话用 16 位或者 EXR。Normal务必 8 位以上最好 16 位。8 位的法线在斜面多的模型上会出现色阶看起来像有台阶。打包图8 位就够了灰度信息 256 级对粗糙度、金属度来说完全够用。4.3 Dilation 和 Padding 千万别省这一条我要单独拎出来讲因为它是最容易被忽略、后果最明显的一个参数。Dilation扩边是把 UV 岛边缘的颜色向外扩张若干像素。为什么需要因为引擎渲染时UV 边界处的采样会稍微超出岛的范围如果岛外面是空的往往是黑色或者透明边缘就会出现黑边或者亮边。合并 Texture Set 之后UV 岛数量变多、排布变密Dilation 不够直接导致接缝斑驳。我的设置习惯2K 贴图8-12 像素4K 贴图16-24 像素如果岛间距特别窄往上再加SP 导出窗口里 Dilation 有自动和手动两种模式。自动模式一般够用但遇到那种 UV 排得特别密的模型自动算出来的扩边量可能不够。这种时候手动设大一点或者干脆回建模软件重新排 UV 拉大间距。Padding 和 Dilation 是两个概念。Padding 指的是 UV 岛之间的间距是建模阶段就要留好的Dilation 是导出时在岛周围生成的冗余像素。两个配合着看间距大Dilation 就可以小间距小Dilation 必须大但太大又会互相侵占最后还是得回去改 UV。提示导出后一定要在引擎里实际看一眼接缝。SP 视口里看着好好的进了引擎出现黑边的情况太常见了早点发现省得返工。5. 我踩过的坑与排查速查表5.1 合并之后材质串色、蒙版错位这是最常见的问题基本都指向同一个原因烘焙没重做或者 UV 有重叠。排查顺序先看 UV。在 SP 里打开 UV 视图检查是否有岛互相重叠。有重叠的话无论蒙版画得多准贴图必然打架。这个必须回建模软件解决SP 里改不了。再看烘焙。如果 UV 没问题但蒙版位置偏了八成是烘焙图和当前 UV 对不上。重新烘焙一遍特别是 AO 和 Color ID 这两张位置对不对一眼就能看出来。还有一种情况是Color Selection 选错了颜色。ID 色如果相近拾取的时候容易拾到相邻的部件。回头检查 ID 色卡把色相再拉开一点重新烘。5.2 接缝处的黑边与亮边接缝问题我在项目里遇到过不下十次总结下来有这么几类原因Dilation 不够。这是最常见的。导出时把扩边调大重启引擎看效果。如果调大也没用那就得回去看 UV 岛间距。Normal 贴图精度不够。8 位法线在接缝处会有明显色阶换成 16 位试试。UV 岛朝向不一致。相邻的两个岛如果切线空间方向差很多接缝处法线会明显不连续。这个得回建模软件统一 UV 岛朝向。贴图被引擎压缩过。有些引擎会默认压缩贴图压缩算法在接缝处容易产生伪影。检查一下引擎的贴图压缩设置Normal 图一般要设成不压缩或者专门的压缩格式。5.3 分辨率不够导致的糊合并之后画面整体发糊这是分辨率平摊的直接后果。判断方法把贴图分辨率从 4K 提到 8K如果细节立刻清楚了那就是分辨率问题如果提高后还是很糊那是蒙版或材质本身的问题。解决办法有两条路一是提高输出分辨率。4K 提到 8K代价是显存和包体。这个要结合项目实际目标平台判断移动端上 8K 贴图压力很大。二是把关键部件拆出去。主件单独一组给高分辨率杂项一组给低分辨率。这是我更推荐的做法收益和代价比较平衡。5.4 引擎里材质对不上号的常见原因贴图导出后进引擎材质效果和 SP 里差得远这种问题排查起来有几个固定套路现象可能原因排查动作整体偏亮或偏暗颜色空间设置错误检查 Base Color 是否按 sRGB 导入金属件全是塑料感Metallic 通道打包位置错对照引擎文档检查通道对照表粗糙度不生效打包图被当作单通道读检查材质节点是否按 RGB 拆分法线方向怪异法线格式DirectX/OpenGL不匹配检查引擎的法线 Y 轴翻转设置接缝明显Dilation 不足或压缩伪影调整扩边关闭或调整压缩颜色空间这件事值得单独说。Base Color、Emissive 这类带颜色的图应该按 sRGB 导入Roughness、Metallic、AO、Normal 这类数据图应该按线性Linear导入。搞反了直接导致整体明暗错位这个坑新手特别容易踩。5.5 问题速查表把上面这些整理成一张表方便快速定位症状第一怀疑快速验证蒙版位置偏移烘焙未重做对比 AO 图和模型部件之间串色UV 重叠打开 UV 视图检查接缝黑边Dilation 不足导出时加大扩边画面整体发糊分辨率平摊提到 8K 看是否改善金属度失效通道打包顺序错检查引擎通道对应明暗整体错位颜色空间搞反检查导入设置蒙版边缘有锯齿分辨率或抗锯齿不足加轻微 Blur6. 一些能省时间的实战习惯6.1 用 Smart Material 和锚点做复用合并 Texture Set 之后材质层会变多堆栈会变长。这时候如果每个部件都从头画工作量很吓人。我的做法是先把一个部件做到满意另存为 Smart Material然后其他部件直接拖这个预设进来改颜色、改粗糙度就行。结构、蒙版逻辑、滤镜链全部复用只调参数。Anchor Point是另一个提效利器。它能把一个层的信息引用到另一个层实现跨层的信息传递。比如用底层生成的曲率信息驱动上层的磨损蒙版改动底层时上层自动跟着变。合并 Texture Set 的场景下锚点可以减少大量的重复蒙版绘制。具体用法是在源层上加一个 Anchor Point给它起个名字然后在目标层的蒙版或属性里引用这个名字。这个功能刚上手有点绕但用过一次就离不开了。6.2 团队协作里的命名与版本约定一个人做资产命名随便点无所谓多人协作命名不规范就是灾难。我的固定约定Texture Set 命名项目前缀 部件名比如Rifle_MainBody导出文件名$textureSet 通道名靠变量自动生成不手动改图层命名按材质类型分Metal_Base、Metal_Wear、Rubber_Grip前缀统一文件夹结构按资产分文件夹每个资产下再分 SourceSP 工程、Textures导出贴图、Mesh模型版本管理上SP 工程文件建议每完成一个阶段就存一个新版本号别一个文件从头改到尾。合并 Texture Set 这种操作一旦做错回退到上一个版本是最快的解决办法。6.3 什么时候该拆回去合并不是一劳永逸的。项目推进过程中有时候会发现合并反而带来麻烦这时候要果断拆。该拆的信号某个部件需要独立的分辨率跟其他部件差距太大某个部件频繁改版每次改都要动蒙版效率反而低最终输出分辨率压不住精度需求糊得没法看有的部件需要特殊通道比如 Emissive、透明跟其他部件混在一起不好管理拆回去的操作是Split Texture Set但说实话拆比合麻烦得多。合并前想清楚比事后拆划算。我个人的判断标准如果合并后某个部件的有效像素面积掉到原来的三分之一以下就该考虑拆了。这个阈值是经验值具体项目里可以灵活调。最后分享一个我用了很久的小习惯每次合并 Texture Set 之前先把 SP 工程另存一份带merge后缀的版本。合并做完、烘焙重做、蒙版铺完确认没问题了再删掉旧版本。这个动作花不了十秒但在我唯一一次手抖合并错 Texture Set 的时候它救了我一整个下午的工作量。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →