需要在支持的着色器里用灰度高度制作、调整凹凸时,先选 Bump map;目标流程要求明确的表面方向,尤其是游戏资产烘焙时,先选切线空间 Normal map。 如果外轮廓和真实深度必须变化,就需要几何或真正的置换。
灰度凹凸贴图记录高度,法线贴图记录方向。两者都只改变着色,不移动网格。从同一张高度图转换出来的法线图,不会自动增加表面细节;Bump 也同样会响应移动的光源。
本文怎样比较两种技术
比较的任务是给已经展开 UV 的表面增加浅浮雕,同时保留原网格。重点考察制作方式、携带的信息、接入流程、叠加方式和常见失败原因。Blender 4.5 LTS、Unity 6 文档核对于 2026 年 10 月 22 日。
原创示意图采用同一份周期高度数据、相同的导数缩放、光源和着色函数。其中一条路径直接使用计算出的法线,另一条先编码为 8 位 RGB,再解码、归一化后着色,用来单独展示数据表示方式的差别。它并非 Blender 渲染、烘焙质量测试或 GPU 性能测试。
SeamlessCanvas 是我们自己的产品。下文把照片派生贴图列为一种起步方式,但它不能替代针对具体网格进行的高模到低模烘焙。
左侧是高度数据,随后是编码后的法线。最后两格使用同一份源坡度,因此细小数值差异来自 RGB 量化。在实际项目中,渲染器的过滤方式或切线处理还可能引入其他差异。
先按实际任务做选择
| 你要完成的任务 | 更合适的起点 | 原因与限制 |
|---|---|---|
| 在 Blender 中绘制浅划痕、毛孔或程序化颗粒 | Height 接入 Bump | 易于修改与缩放;最终效果仍受凹凸过滤和映射影响 |
| 把雕刻细节转移到游戏低模 | 烘焙的切线空间法线图 | 记录相对于目标网格的方向;需要匹配的 UV 与切线 |
| 向 Unity 的 Normal Map 插口交付细节 | 切线空间法线图 | 符合着色器输入要求;灰度图需要先转换 |
| 把烘焙倒角与另一份细颗粒叠加 | 烘焙法线加独立的 Bump/细节法线 | 保留两个可独立调整的尺度;避免重复施加同一份浮雕 |
| 让砖边、轮胎花纹或岩壁轮廓凸出 | 几何或置换 | 会改变形状;单靠 Bump 和 Normal 不会改变外轮廓 |
| 从一张光照均匀的材质照片开始 | 估计得到的 Height/Normal 配对 | 适合草稿;颜色和照明可能被错认成几何 |
这里不适合给出一个总分。手绘高度场、雕刻烘焙和照片派生贴图,信息来源不同。如果所谓“Normal 胜出”的对比图,只给法线路径提供了精细雕刻,就没有单独比较贴图技术本身。
Bump map 储存什么
本文中的 Bump map 指用于着色的单通道标量高度纹理。通常白色表示更高、黑色表示更低,实际方向还取决于反相与着色器缩放。着色器读取相邻位置的高度变化,用它来偏转着色法线。
Blender 的 Bump 节点提供 Height、Strength、Distance 和 Normal 输入。这使灰度绘制与程序高度非常好用,修改高度图案时不必手工编辑向量颜色。
关键在于坡度,而非某个像素单独有多亮。在普通的纯 Bump 设置里,全白图和全黑图的高度梯度都为零,所以两者都不会产生浮雕。给所有高度值同时加上一个常数,也不会改变坡度;提高对比度会改变坡度,因而可能增强效果。
Bump 并非只能处理“竖直方向的光照”。两个纹理方向上的导数会共同生成倾斜法线,响应来自不同方向的光源。它的限制来自标量高度场的表达、过滤过程,以及实际表面在这层细节尺度上仍然保持平整。
灰度也不等于“必须是 8 位”。高度数据可以有更高精度。Blender 置换指南指出,相比常见的 8 位图像,16 位或 32 位浮点凹凸图可以改善结果,尤其适合原本会出现阶梯的渐变。
Normal map 储存什么
法线贴图编码的是方向向量。常见切线空间贴图中,红、绿对应局部切线方向,蓝对应朝外方向。在 8 位无符号 RGB 图像里,约 (128, 128, 255) 就是常见的平坦法线颜色。
Blender 的 Normal Map 节点把图像转换成着色法线。文档要求切线空间贴图采用匹配的 UV 坐标,并把图像设置为 Non-Color。
需要分清两种来源。由高度图派生的法线,记录的是该高度场的坡度。由精细网格烘焙的法线,记录的是另一个表面相对于目标网格的方向,可能包含单张照片没有的信息。但无论哪种来源,都不会把原表面的真实外轮廓送给低模。
物体空间法线使用另一套参照坐标,看上去也常有更多颜色。不要只看到文件名带“normal”就选 Tangent,应先查清资产的制作方式。
在 Blender 中分别接对两种贴图
设置凹凸时先固定基础颜色与粗糙度。使用已展开 UV 的平面或简单圆角物体,配一个面光源,让凹凸路径的变化容易观察。
图中是连接关系,并非界面截图。高度进入 Bump 的 Height,RGB 法线进入 Normal Map 的 Color,两条路径最终都向着色器提供 Normal 输出。
路径 A:灰度高度接入 Bump
- 添加 Image Texture,打开高度图,将 Color Space 设为 Non-Color。
- 连接 Image Texture 的 Color → Bump 的 Height。
- 连接 Bump 的 Normal → Principled BSDF 的 Normal。
- 从适合物体尺度的较小 Distance 开始,提高到能够看清凹凸;如果棱线像鼓起来一样,再降低。Strength 用于混合效果,Distance 则是高度乘数。
- 如果已知凸起看上去凹下去了,对照明确的参考特征,必要时启用 Bump 的 Invert。
路径 B:RGB 图像接入 Normal Map
- 使用另一张 Image Texture,打开法线图,将 Color Space 设为 Non-Color。
- 连接 Image Texture 的 Color → Normal Map 的 Color。
- 对按切线空间制作的贴图选择 Tangent,使用制作时对应的 UV。
- 连接 Normal Map 的 Normal → Principled BSDF 的 Normal。
- 评估现有资产时先从 Strength 1 开始。效果有误时,先查色彩空间、朝向、UV 和切线兼容性,再考虑增强强度。
Blender 色彩管理指南解释了数值数据图像为何应绕过颜色转换。普通基础颜色图一般仍采用 sRGB 路径。
怎样叠加独立细节而不重复增厚
如果要在已有法线之上加一层新的细颗粒,连接 Normal Map 的 Normal → Bump 的 Normal,把独立颗粒高度接入 Bump 的 Height,再连接 Bump 的 Normal → Principled BSDF 的 Normal。
要能分清每条路径的贡献。如果法线本来就是从同一张高度图生成的,再加一次高度通常会重复增强同一份浮雕。可以逐条断开检查。不要直接平均两张 RGB 法线图的颜色来混合方向场,应采用专门的法线混合方法;适合时,也可以先合成高度来源,再转换成法线。
在 Unity 中匹配法线约定
Unity 的法线贴图介绍明确采用 Y+ 法线,也常称为 OpenGL 格式。纹理导出中的“DirectX”通常指相反的绿色通道约定。这里说的是数据约定,并不表示贴图只能通过某一种图形 API 使用。
对于已经编码好的 RGB 法线图,在导入器中把 Texture Type 设为 Normal map 并应用设置。不要给这类图像启用灰度转换,然后把导入的资产分配给材质的 Normal Map。
对于真正的灰度高度图,Unity 的 Normal Map 导入设置提供 Create From Grayscale,并带有 Bumpiness 和过滤选项。它会把高度转换为法线信息,单纯改一个文件名做不到。
约定不匹配时,导入器提供 Flip Green Channel。先选一个明确的凸起标记,分别用上方、下方光源验证,再决定是否翻转。翻转绿色只改变一个方向分量,无法修好错误 UV、物体空间图,或所有看起来“凹凸颠倒”的情况。这些设置作用于 Unity 导入器;从任何生成器导出时,也要再次确认其方向约定。
转换、图像质量与性能的边界
Height 转 Normal 的过程,是计算局部梯度并编码方向。转换强度和像素间距都会影响结果。缩放高度图尺寸或改变 UV 尺度后,同一个转换设置可能读出不同的观感,所以应在最终纹理分辨率与表面尺度下比较。
Normal 转 Height 属于重建问题。法线图没有绝对高度,经过编辑或烘焙的方向场,也未必对应全局一致的某一个高度场。重建可能漂移或损失细节。有原始高度图或雕刻时,应保留它们。
尽量保留无损源文件。强压缩可能在高度图中引入棱线,也可能扰乱法线方向;数据导入方式和合适的法线压缩,与文件扩展名同样重要。
不要按“Bump 一定更快”来选。运行成本取决于着色器实现、采样、导数计算、纹理格式、压缩、分辨率和硬件。源图只有一个通道,也不能保证最终显存比引擎压缩后的法线图更低。本文没有对这些流程做计时或内存基准测试。如果差异会影响交付,应在实际目标设备上测量。
按现象排查结果
| 现象 | 先检查 | 可以尝试的调整 |
|---|---|---|
| 灰度图造成奇怪的彩色光照 | 解码路径错误 | 接入 Bump 的 Height,或先转换成 RGB 法线 |
| 表面鼓胀、刻痕过深 | 强度太高,或同一高度被重复叠加 | 单独保留一条凹凸路径,降低高度尺度 |
| 只有上下方向的光照像反了 | Y 方向约定 | 用明确特征验证,再试一次绿色通道翻转 |
| 烘焙资产出现接缝 | UV、边缘扩展、切线基或网格被改动 | 保留烘焙目标的三角化与兼容切线,必要时重新烘焙 |
| 中间有细节,外轮廓仍然平直 | 采用的是着色技术 | 给边缘建模,或使用正确设置的置换 |
| 印刷文字变成凸起棱线 | 颜色被当成了高度 | 从源高度图中去掉由颜料颜色产生的假浮雕 |
真正的置换会改变表面位置,需要合适的几何与渲染器设置。Blender 置换文档区分了真实置换与凹凸着色。把法线强度提高,无法补回缺失的视差、真实孔洞或置换后的轮廓。
适合时,从照片派生的一对贴图开始
SeamlessCanvas 照片转 PBR 工具支持登录后免费生成贴图。当前 Height 根据图像亮度和局部变化估计浮雕,Normal 则从这份估计高度派生方向。它不会分析看不见的高模网格。
可以用一张干净图像探索石材、木材或织物材质。开始时,选择生成的 Height 接入 Bump,或者选择生成的 Normal 接入 Normal Map,先走一条凹凸路径。在移动光照下检查,去掉投影、颜色标记产生的假凹凸,再根据目标软件支持的流程决定使用哪种。
人物雕刻、硬表面烘焙,以及依赖特定低模拓扑的资产,应采用专门的烘焙流程。如果你要调整的是反射质感而非浮雕,请看独立的粗糙度贴图指南。
常见问题
Normal map 一定更准确吗?
不一定,信息来源更关键。精细雕刻的烘焙能记录简单高度图缺少的方向;把同一张高度图转成 RGB,并不会发现额外形状。导入错误也会让任一路径的结果变差。
Bump map 可以直接放进法线插口吗?
如果插口要求编码后的 RGB 方向,应先转换。Blender 用 Bump 节点评估灰度高度,Unity 则能在导入器里通过 Create From Grayscale 转换。
生成套装里的两张图都应该用吗?
当两张图提供不同信息,并且有明确的合成方式时,可以同时用。如果 Normal 正是从配套 Height 派生的,先用一条凹凸路径,需要时再加入独立细节。
两种贴图都会改变轮廓吗?
都不会。两种方法改变着色法线,同时保留网格。边缘深度与形状需要真实变化时,使用几何或真正的置换。
官方参考资料
- Blender 4.5 Bump 节点,高度派生法线与控制选项。
- Blender 4.5 Normal Map 节点,方向解码、坐标空间与 UV 要求。
- Blender 4.5 色彩管理,数值图像数据。
- Blender 4.5 置换,着色凹凸与真实表面置换的区别。
- Unity 6 法线贴图介绍,法线贴图与 Y+ 约定。
- Unity 6 Normal Map 导入设置,灰度转换与绿色通道翻转。