☰
Substance Painter 到 Unity 的 PBR 材质导入与色彩空间匹配指南
2026/10/14 4:57:14 网站建设 项目流程

接手这个标题的时候我在想,它的核心痛点其实是很多美术师和初学 TA 的共同疑问:Substance Painter 里明明调得挺满意的材质,一导入 Unity 就发灰、发闷、金属感跑偏,甚至出现诡异的暗边和反光。这篇文章我就把自己在不同项目中来回连接这两套工具的经验整理出来,重点讲清楚导出设置、贴图通道、Unity 材质初始化、线性色彩空间和匹配视口光照这些容易出偏差的环节。适合正在做独立游戏、外包项目,或者刚接触 PBR 流程想搞懂基础原理的朋友参考。

1. 进 Unity 之前,先把色彩空间和渲染管线固定下来

这一步很多人会忽略,直接在默认的 Gamma 色彩空间里就开始拖贴图,结果越调越别扭。PBR 材质在 Substance Painter 里看到的明暗关系之所以可靠,是因为 SP 的计算环境是物理线性空间,而 Unity 默认工程如果还是 Gamma Space,同一张贴图在两个软件里呈现出的对比度会明显不同,金属表面的高光衰减尤其明显。

我的做法是在新建工程后直接进入 Edit -> Project Settings -> Player -> Color Space,把选项切到 Linear。切完这一下信息量挺大,它意味着 Unity 对整个画面的光照计算、贴图采样都在线性空间里进行,最后显示到屏幕时才做 Gamma 校正。这个流程和 SP 内部的做法保持了一致,材质导进来后底色的亮度、高光的收敛速度才能对上。如果你的项目因为 UI 或某些旧 Shader 必须在 Gamma 空间下跑,那么材质匹配只能靠经验和肉眼微调,我不建议新项目还这么干。

自己项目里不确定用内置渲染管线还是 URP 的话,需要先想清楚目标平台。传统内置管线的 Standard Shader 对 SP 纹理的支持非常成熟,直接拖入贴图就能用,是很多老项目的标准配置。URP 的话,Unity 新版内置的 Universal Render Pipeline/Lit 同样支持金属度工作流,而且对 GPU 负担更可控。无论选哪条路,Shader 的核心属性都遵循 Metallic Workflow 这一套:Base Map(反照率)、Metallic Map(金属度)、Smoothness(光滑度)、Normal Map(法线)以及可选的高度图与环境光遮蔽。

值得花点时间理解的是,SP 端基于 Metal/Roughness 工作流,而 Unity 默认的 PBR 实现是 Metallic/Smoothness 工作流,两者之间差了一个粗糙度与光滑度互逆的概念。也就是说,SP 导出的 Roughness 贴图并不能直接塞进 Unity 的 Smoothness 通道,必须在导出时处理好,否则材质球会出现一个很怪的现象:金属表面该亮的地方不亮,不该亮的区域却一片惨白。后面我会专门讲 SP 里怎么导出,这里先提个醒:只要你在纹理集设置中看到的是 Roughness,进 Unity 前就得把它转成 Smoothness。

2. 在 Substance Painter 里把导出模板和通道打包一次搞定

Substance Painter 的导出窗口是最容易拉低效率的地方,因为模板列表堆满了各种引擎预设,新手很容易随手选一个名字差不多的就往出导。我的标准流程是直接用软件自带的 Unity 模板,它真实名称一般是 Unity 5 (Standard) 或 PBR (Metallic / Roughness),区别在于有的版本版本更新后会默认把 Smoothness 自动换算并输出到 Alpha 通道,导出后的贴图结构很干净:Base Color 是一张 RGB 图,Metallic 的 R 通道存金属度,Smoothness 存在 A 通道,法线贴图单独输出。这就是 Unity Standard Shader 的标准输入格式,省去了一系列手动节点连接。

如果手头项目用的不是 Standard Shader,而是需要自定义通道管理,我会自己新建一个导出预设:Base Color 输出 PNG 或 TGA,Metallic 只需要 R 通道,Smoothness 放到 A 通道,环境光遮蔽单独输出一张灰度图,法线贴图务必选择 DirectX 格式。SP 默认生成的法线是 OpenGL 的绿色朝上风格,Unity 内部采用 DirectX 风格的 Y 轴方向,如果直接通用会出现光照凹陷的视觉错误。在导出设置的 Normal Map 格式里选择 DirectX,或者进入 Unity 后在模型导入面板把法线方向翻转——我更推荐前者,因为贴图本身闭合之后,给其他人或换引擎时语义更清晰。

通行的一套让美术操作更快的做法,是把 AO、Cavity 和 Curvature 叠加烘焙进资源库,但考虑到 Unity 对 Channel Packing 的兼容,我把 AO 分离开来单独控制,这样在引擎中调节环境接触阴影强弱会更灵活,不用重新回 SP 改参数。好多教程喜欢把这些信息拼进一张图,节省采样带宽,但在移动端项目或做快速原型时,单独出 AO 图后期调整成本低很多。另外,导出尺寸建议直接定死 2048 或 4096,不要到 Unity 里再做放大缩小的补救,SP 导出 Extra Channel 时如有大量细节纹理可以同步输出 Curvature 和 Height,以备后续合并物理材质细节。

3. 将贴图对号入座到材质球:Standard 与 URP 的组装细节

建好了材质球并指定给模型之后,整个流程的关键其实就是贴图槽位的“翻译”工作。我一般会先创建一个 Standard 材质球或 URP/Lit 材质球,然后把 Base Map 拽进 Base Map 槽位,Metallic Smoothness 按模板生成时已默认合并成一张图,直接拖拉到 Metallic 槽位就行。这里 Sp 导出的 MetallicSmoothness 贴图的 R 通道是金属度,A 通道是光滑度,而材质球面板上 Metallic 滑块旁边如果只有一个 Map 输入,Unity 会默认从这张 Map 中读取 R 通道作为金属度、A 通道作为光滑度,逻辑是隐含在名称里的。

Smoothness Source 这个选项值得每次都确认一下。在 Standard Shader 的材质面板里可以找到 Smoothness 下方有一个下拉菜单,默认是 Metallic Alpha,也就是从上面的 Metallic Map 中取 Alpha 通道作为光滑度来源。如果你之前不小心把一张纯黑白 AO 图拖了上去,就会发现金属和粗糙区域毫无层次感,因为对比度都被光滑度给吃掉了。我通常是保持 Metallic Alpha 选项,并让 SP 端把 Roughness 预取反为 Smoothness 写入 A 通道,这样就再也不用在引擎里手动翻转贴图了。

法线贴图的接法相对直接,但要注意平台差异。把 DirectX 版本的法线贴图拖入 Normal Map 槽位后,如果某些素材是从市场下载的,可能会自带 OpenGL 版本,你会发现石头表面的朝向不太对劲,此时可以在 Unity 的导入设置里勾选 Create from Grayscale,或者用平台的 Texture Type 选项直接调整 Normal Map 的 Y 轴方向,灵敏度较高的话甚至能把错贴图修正回来。实际操作中,我更愿意在 SP 导出阶段就用 Fixed 模板,这样可以减少后续模型重新导入时引发的各种 Asset 缓存冲突。

4. 让 Unity 视口追上 SP 视口:环境光与后期处理的匹配思路

即使贴图通道全部装对,很多人依然会发现 Unity 里怎么看都比 SP 里“闷”。这问题几乎都出在环境光和反射探头缺位上,SP 默认的 IBL 环境提供了非常丰富的高光细节,而 Unity 场景如果只有一个平行光,没有环境反射源,金属物件就完全塌陷下去。我个人习惯导入模型后的第一步不是调整材质参数,而是打开 Lighting 设置,把 Environment Lighting 的 Source 设为 Skybox,Intensity Multiplier 调至 1.0 附近,然后加上一个 Reflection Probe,覆盖场景核心区域。

平行光在这个流程中的角色更像是一个明显方向性的补光,而不是唯一光源。金属材质需要看到环境在表面上的变化,真实感主要来自反射探头的 Cubemap 而不是直接光。我建议场景里至少放三个的反射源:一个主反射探头覆盖整个模型展示区域,一个半透明的探针在后方补出轮廓,如果预算允许,再添加一个轻量的 Planar Reflection 或者用屏幕空间反射的后处理效果。这样才跟 SP 的 Iray 实时预览观感接近,尤其是金属拉丝、车漆、锈斑在高光下出现的那层环境色混合感。

后期处理体积也不可忽视。SP 的渲染默认带有一层自然的曝光和对比,而 Unity 出图偏“生”。我在项目里配置了通用后处理组件:Bloom 阈值在 0.8 到 1.0 之间,Tonemapping 采用 ACES 或中性,亮度饱和度微调一档,重点是这个配合 Linear 色彩空间后,带金属边缘的物体不会再出现高光死白。对比时先关闭后处理,确认材质基本符合,再开后期拉出氛围感,否则会被滤镜效果误导,调整材质时容易做过头。

5. 翻车现场盘点:纹理发暗、接缝发亮、粗糙度反了

不管准备多周全,实际项目里总会有几种高频问题来回出现,我把它们整理成了一张快速自查表,遇到奇怪现象直接对照排查。

第一类现象是模型整体发黑或反射发灰,这通常是法线贴图的坐标系不一致导致的,尤其在 OpenGL 模板和 DirectX 模板之间切换时,光照方向会呈现整体性反转,看起来像是所有突起表面都内凹了。解决办法透明度很高:在 SP 导出设置里确认 Normal Map 选择 DirectX,或者回 Unity 后在模型导入高级选项里勾选 Flip Green Channel,往往一次就能修复。

第二类情况是光滑度过高或过低导致金属表面变成塑料。这时候不要急着调材质,先看 Smoothness Source 是不是 Metallic Alpha,再确认你拖进来的是不是 SP 导出的 MetallicSmoothness 合并图。如果你直接把 Roughness 原图拖入,那么面对的是一张“粗糙度”贴图,通道值天然和光滑度相反,直接导致表面看起来要么全糙要么全亮。用脚本或手动对 Roughness 取反,或者在 SP 导出模板里做一次 Invert,都可以保持流程干净。

第三类是 AO 对材质的影响过大,导致暗部过黑,缝隙几乎没有反弹光。SP 导出的 AO 是独立图,进 Unity 后如果直接把它挂在 Base Map 的上面或混进 Metallic Alpha,效果会很难看。我的习惯是在 Unity 里给 AO 单独用一张 Multiplier 贴图或乘入环境的间接光照,而不会烧进基础贴图通道,这样在做昼夜循环或不同场景光照时,AO 的强度仍然可控。

最后一条经验是关于纹理压缩格式的。Android 或 iOS 平台经常需要把贴图压缩成 ASTC 或 ETC2,但法线贴图在压缩时如果格式不对,画面会出现明显的块状或噪点。推荐为法线贴图单独指定压缩格式,不要复用 Base Color 的压缩方案。Unity 导入面板里把法线贴图的 Texture Type 设为 Normal Map,然后选择合适的压缩质量,很多看起来“材质不干净”的问题其实都出在压缩环节,跟纹理本身没关系。

我目前做新项目时的标配流程,就是线性色彩空间、SP 导出 Unity 模板、直接拖入材质球、环境反射探测齐全再加一层轻微后期。整个过程熟练之后,从 SP 到 Unity 半小时内可以完成一个展示级 PBR 材质。你要是手头刚好有调试中的模型,不妨照着这个链路走一遍,大概率能把视觉差异控制在一个很小的范围内。

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

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

立即咨询