做环境美术和独立游戏这几年,我栽过最大的跟头就是手绘地表贴图。你在PS里扣了两个通宵的泥土细节,刷了一堆颜色变化,肉眼看着挺像回事,一进引擎方向光打下来,那块地面瞬间变成了一层磨砂纸贴在平面上——怎么打光都假。问题不在你的画功,在于你手里只有一张颜色图。
后来我把工作流切到PBR,用Materialize这类工具从单张图直接"炼"出全套次世代材质,5分钟出活,效果比我手绘一周的还真实。今天这篇就掰开揉碎聊聊,我平时是怎么用这个免费的"纹理炼金炉"从一张普通照片或手绘稿,生成一套能在Unreal、Unity里直接用的PBR贴图,以及哪些参数必须手动调、哪些坑我踩得最惨。
如果你也是那种被手绘地表折磨得怀疑人生的场景美术、独立开发者,或者正在摸索PBR流程的转行小白,这篇文章应该能帮你省掉一大截弯路。
1. 贴图"看着假"的病根,不在画功而在信息分层
1.1 一张Diffuse撑不起真实的表面
先捋一个基础概念:我们平时说的"手绘贴图",绝大多数时候指的是Diffuse或Albedo,也就是颜色图。但当引擎渲染一个表面时,决定它真实感的并不是颜色,而是表面对光的响应方式。
你可以把漫反射贴图想象成一张打印好的彩色照片,贴在一个光滑的塑料板上。照片里就算有泥土、碎石、裂缝的颜色信息,光照一打下来,整块表面依然是一个均匀的、像塑料一样的反光体。为什么?因为真实世界里,一块粗糙地表对光的响应是极其不均匀的:凸起的位置高光更强,凹陷的位置光线进不去形成阴影,不同角度的微小表面反射方向完全不同,干燥土壤和潮湿石头的粗糙度差异也极大。这些信息,一张颜色图根本装不下。
我做第一个3D场景时,花了将近一周的业余时间手绘一张草原地表,自认为细节丰富、笔触细腻。放进引擎后,方向光一开,整个草原像块绿色地毯,毫无质感。当时我以为是光影设置不对,试了一堆环境参数,浪费了几个晚上。后来才意识到,问题出在资产本身——缺了法线、缺了粗糙度、缺了AO,再好的光照方案也救不回来。
1.2 PBR其实就是"把表面信息拆层装"
PBR(Physically Based Rendering,物理基础渲染)最核心的思想,不是某个软件或某个公式,而是"分层"。它把真实表面的光学特征拆成几个独立通道,每个通道只负责一类信息:
- Albedo:表面本身的颜色,不包含光照信息
- Normal:表面的微小凹凸方向
- Roughness:表面的微观粗糙程度,控制高光的扩散范围
- Metallic:表面是金属还是非金属
- AO(环境光遮蔽):凹陷处被遮挡产生的接触阴影
- Height:表面的高度信息,也是生成法线的基础
这种拆分方式很像做菜时的"备料":颜色是主料,法线是切工,粗糙度是火候,AO是摆盘。打好光之前,所有风味都已经在材质里了。引擎拿到这堆信息层,按照光照物理规则去"烹饪",才能得到真实的结果。
这也是手绘流程做不出真实感的核心原因:手绘时所有信息都糊在一张图上,引擎根本没有办法从中单独提取"这里应该暗""这里应该反光"的物理线索。
1.3 Materialize在PBR流程里扮演什么角色
Materialize是一款免费的单机工具。它的核心能力可以概括成一句有点玄学的话:"给你一张图,帮你把其余五张图猜出来"。
它不是绘图软件,你在里面不需要一笔一笔画贴图。它是一个"烘焙与生成"工具,依靠算法从你提供的基础颜色或高度信息中推导出法线、AO、粗糙度等派生贴图。同时它也提供了一定程度的手动干预能力,比如用蒙版控制粗糙度的局部变化,让结果不完全是"一键生成"的公式感。
放在整个PBR流程里,Materialize的位置是"素材加工厂"。你用相机拍一张真实的泥土地面、从网上找一张带无缝平铺属性的石头图,或者手绘一张灰度图,丢进去,几分钟后拿出来的就是一套完整可用的PBR贴图。这个过程不需要 Photoshop 里复杂的滤波计算,也不需要 Substance Designer 的节点编程基础,门槛低,见效快。
2. 从一张照片到六张PBR贴图:完整操作流程
2.1 素材准备:一张好源图决定八成上限
Materialize号称能从单张图生成全套贴图,但不同的源图,出图质量差距极大。我试过直接把游戏截图、手机拍摄的杂图丢进去,出来的法线图基本是灾难。实践证明,好源图需要满足三个条件:
- 平铺无缝(Tileable):地表材质在引擎里通常是平铺的。源图如果有明显接缝或者不规则分布的大块特征,平铺时接缝会非常扎眼。你可以在Materialize里直接处理平铺问题,但源头材质越接近无缝,后期调校越省心
- 均匀光照:源图最好是阴天、阴影不太重的环境拍的。大面积硬阴影会被算法误判成高度起伏,导致法线图出现假凹凸
- 无高光反射:有高光的区域会被当作发光或者凸起,生成法线后那一片会鼓起,修复起来很麻烦
如果素材是从网上找的,尽量选"texture atlas"或者"seamless texture"类型的图库。我自己常用的是从CC0图库(比如ambientCG)下载的无缝贴图,它们本身质量高,兼容性也好。
把素材拖进Materialize窗口,主预览区会显示这张图。左侧控制面板会列出各个输出通道,默认已经生成了简单的初始结果。
2.2 Height(高度图):所有派生贴图的起点
Materialize的所有派生通道几乎都以Height为基础。所以我的习惯是,永远先调Height。
Height通道的本质是"亮度到高度"的映射:源图里亮度高的区域被当成较高位置,亮度低的当成凹陷。所以你要在Height设置里找到几个关键控制项:
- 强度(Strength):整体凹凸幅度。数值过高会让表面像月球坑,过低则几乎没起伏。地表材质我一般取0.5到0.8之间,岩石可以到1.0以上
- 模糊(Blur):对高度图做平滑处理,抑制噪点。源图噪点多的话,模糊开大一点,不然法线会花成一团
- 对比度/增益:控制高度图的黑白跨度。拉高对比度,细节更硬朗,但也更容易出现硬边
调节过程中,实时预览面板可以看到高度图的效果。注意,如果你后面要用法线图,Height的细节质量直接影响法线的质感,所以这一步值得花两分钟细调。
2.3 一口气生成Normal、AO、Roughness、Metallic
Height调满意之后,切换通道生成就快了。
- Normal(法线):在通道列表里打开Normal,算法会自动从Height计算梯度方向,生成反映表面微观起伏的向量图。这里唯一需要调的是强度(Normal Intensity),默认值往往偏温和。室内场景、近距离观察的地表,法线强度建议调到1.5到2.5之间,远景可以低一些。调太高的话,光照斜射时凹凸会显得"发泡",不自然。
- AO:AO通道生成的是接触阴影。Materialize有独立的AO计算逻辑,需要调整的参数主要是半径和对比度。半径决定阴影扩散范围,小石块纹理用3到5像素的半径就够了;大裂缝、深槽纹理可以调到15像素以上。对比度控制明暗分界的锐利程度,太高容易显得脏。
- Roughness(粗糙度):Materialize会从源图的局部对比度和高度信息推算一个基础粗糙度分布。地表非金属材质,整体粗糙度应该在0.6到1.0这个区间,但需要局部分布:沙土更糙、裸露岩石略光滑、水洼或湿润处接近0.2到0.3。这块算法给的结果通常是个"平均脸",我会手动拉曲线或者配合蒙版修正高光区域。
- Metallic(金属度):地表工艺中绝大多数是非金属,整个Metallic通道填黑色(0.0)即可。如果某些区域有碎金属片、工具残骸,在那块手动画白色。默认生成器经常把一些深色区域误判为金属,记得检查并抹掉。
2.4 导出时的引擎预设与格式选择
Materialize支持直接按引擎预设导出。菜单里的Export面板可以看到Unity、Unreal、CryEngine、Blender等选项,它们实际上是把同样的贴图按各引擎的命名规范和格式偏好打包。
如果你用Unreal:
- BaseColor对应Albedo
- Normal(DirectX版本,绿色通道方向按引擎规范)
- Roughness、Metallic、AO分别导出为独立的灰度图
如果你用Unity:
- 命名需要符合URP/HDRP的约定,比如MetallicSmoothness或者Metallic与Smoothness合并
- 具体看你的管线设置
导出格式我推荐TGA或者PNG,16位深度在某些引擎里支持更好,但8位对于地表大多数情况够用。记得导出的尺寸要设置成2的幂次方,常见如1024、2048、4096,这个细节后面会聊。
3. 这张贴图是真的"猜"出来的吗?原理与参数怎么配合
3.1 法线图:高度图的"导数"
很多人觉得法线生成是黑魔法,其实就是数学。法线贴图保存的是每个像素处表面法向量相对于基准方向的偏移。而法向量偏移量与高度图的"梯度"有关,就是说高度图中亮度变化越剧烈的地方,法线偏转越厉害。
说人话:法线图是从Height里"求斜率"得到的。哪怕你只有一张灰度图,只要它有明暗变化,算法就能算出每个点的表面朝向,然后把这些朝向信息编码成RGB。当引擎的光照计算碰到这些朝向差异时,平坦的平面就会呈现凹凸不平的视觉效果。
所以Height的细节一旦糊了,法线一定糊,因为根源丢了。这也是为什么我特别强调源图和Height这一步。
3.2 粗糙度的工作原理:为何"乱"一点更真实
粗糙度贴图严格来说不是"从照片里提取"的,而是靠启发式推导加上你的人为修正。它的物理依据是微观表面的不规则程度:微观不平整会让反射光分散,形成较柔和的漫反射;微观较平整则反射集中,形成锐利高光。
真实地表几乎没有完全一致的粗糙度。一块土地里,细沙区域粗糙度接近1.0,露出的石头可能0.7,水坑0.1。哪怕同一块表面,因为颗粒分布不同,粗糙度也有微变化。这种变化正是"生活感"的来源。
Materialize的默认粗糙度生成逻辑是:从高度图局部方差推断表面"乱不乱",方差大的地方粗糙度偏高。这个方向大致正确,但幅度太平均。我的做法是先接受它的结果,然后在需要重点表现的区域,用蒙版或局部磨皮工具手动把粗糙度调"花"一点——这里更糙、那里更滑,哪怕实际差不了多少,人眼也会觉得材质内容更丰富。
3.3 三组核心参数的手感区间
我整理了一张日常参数参考表,按地表材质类型分类。不同用途可以直接照着起步,再按实际效果微调:
| 材质类型 | Height强度 | 法线强度 | AO对比度 | 粗糙度范围 |
|---|---|---|---|---|
| 泥土地 | 0.5~0.7 | 1.5~2.0 | 0.4~0.6 | 0.75~1.0 |
| 岩石地表 | 0.8~1.2 | 2.0~2.5 | 0.5~0.8 | 0.6~0.85 |
| 草地/苔藓地 | 0.4~0.6 | 1.2~1.8 | 0.3~0.5 | 0.8~1.0 |
| 沙地 | 0.3~0.5 | 1.0~1.5 | 0.2~0.4 | 0.85~1.0 |
这些数值不是绝对的,但它们是一个"差不多的起步点"。每次我在新场景里调材质,都是先把这些参数放进去,然后再依照引擎里的光效微调。如果你完全没概念,从这张表抄作业不会出大错。
4. 让材质摆脱"一键生成"公式感的进阶操作
4.1 用蒙版打破平均化
一键生成的材质最大的问题就是"太均匀"。真实地表有区域分布:石头边上的土更干、树根下的落叶更多、车辙里的土更实。这个不均匀性可以用Materialize的Mask(蒙版)来解决。
你可以手绘一张蒙版,或者用源图的某个通道生成一个Mask。比如把亮度比较低的阴影区域抠出来,再基于这个Mask去调整局部粗糙度或AO强度。听起来抽象,举一个我做"泥泞林间地面"的例子:我用蒙版选中一些较暗、湿润的区域,给它们降低粗糙度、稍微加深AO,中间干燥的区域保持粗糙度偏高。这样引擎里阳光一打,湿润泥泞的地方有微弱反光,干燥土路是完全哑光的,层次立刻出来了。
Materialize对蒙版的支持不算豪华,但基础画笔和阈值调整够用。如果追求更高级的蒙版控制,建议配合Substance或PS,但简单情况下完全不用出这个软件。
4.2 多源图融合:不要只靠一张图
当你做一整片地形时,单张逐步论PBR贴图是不够的。同一块地表,放大到近景和远景时,需要不同级别的细节。Materialize允许你把多张源图叠加融合,比如把一张整体的土壤图作为基色,再把一张碎石图叠加在上面,通过透明度控制碎石的密集程度。
这个操作在Materialize里对应的功能是图层的Compositing。你可以把每张源图想象成一个PS图层,调节混合模式(Overlay、Multiply等)和透明度。我常用Overlay模式给已经铺好的地表叠加一层细微颗粒纹理,增加近景时的细节密度,不需要重新生成一套完整贴图。
4.3 3D预览验证:光照角度是照妖镜
Materialize自带3D预览,可以放一个球体或者平面模型,并且可以实时调整光照方向。这一步千万别跳。
做PBR贴图时最怕的就是"2D看起来完美,3D见光死"。因为法线贴图的凹凸效果在斜射光下最明显,当头光照射时会减弱很多。我习惯在预览里把光源拉到接近水平的角度,观察地面凹凸轮廓;再把光源转到正上方,确认整体明暗没有发闷。两个角度都过关,放进引擎基本稳。
另外一个实用技巧是:在3D预览里用拉近的摄像头距离检查近距离细节,再用拉远的距离检查整体色调是否统一。很多新手只盯着100%视图里的细节,忽略了大比例下材质的"整体阅读性"。
5. 贴图进了引擎才发现的问题:压缩、平铺与翻车排查
5.1 纹理压缩格式直接决定画面糊不糊
很多人在Materialize里导出的贴图看起来清晰锐利,进引擎以后就糊成一团。十有八九是压缩格式没选对。
常见引擎在移动端和PC端对纹理压缩有不同要求:
- 桌面端:BC7或BC5。BC7质量高,但体积大;法线图建议用BC5,因为它保留精度更好
- 移动端:ASTC(4x4或6x6)均衡性不错;也可以选用ETC2,但细节损失比较明显
重点:法线贴图千万不要用和处理漫反射一样的压缩格式。法线图的RGB通道编码的是向量方向,压缩算法会把向量"挤"变形,导致光照方向错乱,轻则凹凸发虚,重则出现紫黑斑块。做实验时我吃过好几次亏,后来固定把法线单独设置成高质量格式,才解决问题。
5.2 接缝问题:从源图阶段就掐死
平铺材质的接缝问题,最好在进引擎前解决,不要指望引擎自动处理。
Materialize不能像Substance那样一行节点就搞定无限平铺,但配Tiling属性可以控制平铺次数。如果你用的是2048贴图、平铺4次,接缝在单块边界就会比较明显。解决办法是回到源图,用Photoshop的高通滤波或偏移滤镜检查接缝,把有明显亮度跳变的地方修复掉,再重新走一遍Materialize流程。
另一个技巧:平铺时不要让某一层的纹理方向太规律化。比如一层泥土基础间距铺4x4,一层次级碎石也铺4x4,两者完全重合,画面会出现明显的网格感。我通常把主纹理设置为4x4,叠加细节层设置为5x3或者3x7,打破周期,视觉上更自然。
5.3 常见翻车现象排查清单
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 法线凹凸方向反了 | 法线贴图版本和引擎要求不匹配 | 蓝绿色通道翻转一下,或导出时选对DX/GL版本 |
| 材质发灰发闷 | AO太强,或者Albedo有光照信息 | AO对比度调低;Albedo重新去除光照 |
| 高光像塑料 | 粗糙度贴图全黑或过于平均 | 整体粗糙度拉高,加局部变化 |
| 接缝明显 | 源图本身不是无缝 | 处理源图平铺,或换无缝素材 |
| 远景花成一片 | 每个通道压缩太狠 | 法线和粗糙度用高精度压缩格式 |
| 表面浮着一层“油” | Metallic通道有白色噪点 | Metallic蒙版清理,非金属全黑 |
这份清单是我在实际项目里反复遇到的高频问题,几乎每次做新材质都要顺手检查一遍。养成导出前查清单、进引擎后先打斜光的习惯,能省掉至少一半的返工时间。
6. 我的个人工作流总结与提速技巧
说到最后,分享一套我跑顺了的完整工作流,适合独立开发者和美术外包小团队:
- 素材阶段:用相机拍或从CC0图库下载无缝源图,保证光照均匀
- Materialize阶段:先调Height,再生成Normal,接着AO,最后手动修正Roughness和Metallic
- 导出阶段:按引擎预设导出,法线单独走高质量压缩
- 引擎阶段:用Directional Light低角度测试,用PostProcess调节曝光后再看材质
- 迭代阶段:主要是法和粗糙度,每次调整之后都需要重新看一遍近景和远景效果
提速方面,我最大的心得是:"永远不要在原始生成结果上反复手调通道"。如果你发现自己为了提高某个特征,在Materialize里拼命调参数,很可能说明源图没选对。最快的路径是换一张更合适的源图,重新跑一遍流程,而不是在错误素材的基础上修补半天。
另外,如果你的工作流已经过了"单张图出全套贴图"的阶段,开始做更复杂的杂交材质(比如泥土混合碎石、草地渐变到泥地),Materialize可以配合Substance Designer一起用。先用Materialize快速生成基础贴图,再把它们作为输入喂给Substance做更精细的图层混合。这套组合拳在保证效率的同时,还能做到不改主流程结构。
Materialize确实不是Substance那样的工业级"怪兽",但作为免费工具,它能做到5分钟从一张图生成一套合格PBR地表贴图的水平。对一个时间永远不够用的独立开发者和场景美术来说,这样简单直接的"纹理炼金术"真的已经是性价比拉满的选择了。