纹理烘焙的核心任务是把高精度模型的表面细节编码为二维图像,让低精度模型在引擎中实时运行时依然能表现丰富的视觉信息。高模往往拥有数百万甚至上千万面,能够承载雕刻细节和精细的光影变化,但无法直接用于游戏或交互场景。低模面数低、性能友好,却缺乏足够的几何细节。烘焙流程就是在这两者之间建立映射,将高模的表观特征转移到低模的贴图上。漫反射贴图、法线贴图和AO贴图是最基础也最重要的三类输出,它们各自解决不同维度的表现问题。

一、三类贴图分别承载什么信息
漫反射贴图通常用于描述模型的表面颜色。在传统渲染管线中,它往往还包含静态光照、阴影和部分反射信息,烘焙完成后直接贴到低模上即可获得较丰富的明暗效果。但在现代PBR工作流中,漫反射贴图的概念被BaseColor或Albedo贴图替代,强调只记录物体的固有色属性,不包含光影信息,因为实时光照系统会负责计算明暗与高光。若把光照烘入PBR管线的固有色贴图中,模型在动态光源下会出现双重光照或明暗不自然的问题。因此烘焙漫反射贴图前必须明确目标引擎的渲染方式。
法线贴图专门表现表面凹凸细节。它不改变模型的实际几何结构,而是通过改变着色时使用的法线方向来影响光照结果。法线贴图的RGB三个通道分别存储切线空间中的X、Y、Z分量,其中多数区域接近垂直表面,因此Z分量占主导,贴图整体呈现淡紫色。烘焙法线贴图时,软件会从低模表面发射射线,命中高模后计算交点处的法线向量,并将其转换到低模的切线空间存储。这样即使低模表面非常平滑,在光照下也能显示出高模表面的凹凸和复杂形状。
AO贴图记录环境光遮蔽关系,通常为灰度图。它的原理是向低模表面各点的半球方向发射大量采样射线,若射线在较短距离内被模型自身其他部分阻挡,则该点接收到的漫射光越少,像素越暗。AO贴图能增强模型缝隙、褶皱、接触面等区域的暗部层次,即使用户场景的实时全局光照不足,也能让模型呈现出更扎实的体积感。AO贴图可以和漫反射或粗糙度贴图合并到同一纹理的不同通道中,以节省采样资源。
二、烘焙前必须完成的准备工作
高模与低模的匹配是烘焙成功的前提。高模可以是ZBrush雕刻、扫描或细分后得到的复杂模型,低模则是最终进入引擎的简化网格。两者在整体轮廓上必须保持一致,尤其是大型转折和剪影边缘,否则包裹框和射线投射会出现明显错误。常见做法是先创建拓扑合理的低模,再通过细分与雕刻生成高模;或者先完成高模雕刻,再手动拓扑出低模。若低模与高模差异过大,烘焙软件会自动包裹却无法正确捕捉高模表面,贴图上会出现拉伸、错位或丢失细节。
UV展开质量直接影响最终贴图效果。低模的UV在烘焙目标区域内不能重叠,否则不同表面位置的像素会相互覆盖。接缝应尽量隐藏在相机难以观察的区域,例如模型背面、衣缝、材质分界处或结构转折处。每个UV岛之间要预留足够的边距,通常建议4到16像素,分辨率较低时可采用16或32像素,防止Mipmap采样时颜色渗出。对于使用镜像UV的模型,法线贴图需要特别处理切线方向,否则镜像区域的凹凸方向会相反,光照出现明显异常。
包裹框的作用是控制射线发射范围,确保只捕捉高模上属于当前低模表面附近的信息。包裹框过小会导致高模细节无法完全覆盖,过大会把远处或背面的几何体也烘焙进来,形成杂斑和漏光。多数工具支持根据低模自动生成包裹框,但自动结果在尖锐转角、密集结构或薄壁区域可能需要手动调整。烘焙前还应统一模型单位与坐标,应用全部变换,并把模型放置在世界原点附近,避免因浮点精度不足导致贴图抖动或接缝断裂。
三、不同工具中的烘焙流程对比
Substance Painter的烘焙功能集成度高,适合大部分游戏资产。导入低模后,在纹理集设置中点击烘焙贴图,即可选择BaseColor、法线、世界空间法线、AO、曲率、位置等多种输出。它支持按命名规则自动匹配高模,例如低模命名为model_low,高模命名为model_high。设置中需要关注最大正面距离和最大背面距离,通常取低模包围盒尺寸的十分之一作为初始值,再根据结果微调。抗锯齿建议设置为4x或8x,尤其在贴图分辨率较低时能明显减少边缘锯齿。
Marmoset Toolbag以烘焙速度和实时预览见长。它允许在3D视图中直接显示包裹框和可能的烘焙误差,适合复杂模型的手动修正。其烘焙项目可以同时输出多张贴图,并针对不同贴图类型设置独立分辨率。使用时先导入低模,再添加高模到烘焙项目,设置采样质量、贴图类型和输出路径。Toolbag对法线贴图的细节保留较好,常被用于游戏和影视资产的最终烘焙与验证。
Blender作为免费方案,同样能够完成三类贴图的烘焙。以Cycles渲染器为例,需要将高模和低模放置在同一场景,为低模创建一张目标纹理,并在材质节点中加入图像纹理节点并选中该纹理。然后在渲染属性中选择Cycles,展开烘焙面板,设置烘焙类型为漫射、法向或环境光遮蔽,调整射线距离和边距,最后执行烘焙。对于法线贴图,需要统一切线空间设置,并确保物体变换一致。下面是一个Blender Python脚本示例,可在脚本编辑器中运行,自动设置AO贴图烘焙并保存结果。
import bpy
# 假设场景中对象名称分别为 HighPoly 和 LowPoly
high = bpy.data.objects["HighPoly"]
low = bpy.data.objects["LowPoly"]
# 确保低模是活动对象
bpy.context.view_layer.objects.active = low
low.select_set(True)
high.select_set(True)
# 创建用于烘焙的目标图像
image = bpy.data.images.new("BakedAO", width=2048, height=2048)
# 为低模材质创建图像纹理节点
mat = low.data.materials[0]
mat.use_nodes = True
nodes = mat.node_tree.nodes
image_node = nodes.new(type='ShaderNodeTexImage')
image_node.image = image
image_node.select = True
nodes.active = image_node
# 切换到Cycles并设置烘焙参数
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.bake_type = 'AO'
bpy.context.scene.render.bake_margin = 8
bpy.context.scene.cycles.use_adaptive_sampling = False
# 执行烘焙
bpy.ops.object.bake(type='AO')
image.save_render(filepath="C:/BakeOutput/BakedAO.png")
四、烘焙参数优化与常见问题排查
漏光与黑边是最常见的问题。漏光通常出现在包裹框设置不合理或UV边距不足时,高模背面信息被错误投射到低模正面,形成不应有的阴影或暗斑。增加最大背面距离并启用工具中的背面排除选项可以减少漏光,但距离过大会导致较薄结构出现穿透伪影。黑边多数源于UV岛边缘没有足够的填充像素,背景色或相邻UV区域的信息被采样进边距。改善方式包括在软件中开启扩张像素功能,或提高UV边距至16甚至32像素,并在后期处理中对贴图边缘进行延伸。
法线贴图出现色块或方向错误,往往与切线空间不一致有关。引擎、烘焙工具和着色器中计算切线的方式如果不统一,会产生光照方向异常。应对方法是在导出和导入时统一使用MikkTSpace切线规范,这是当前游戏引擎普遍采用的标准。Blender、Substance Painter和主流引擎均支持MikkTSpace,勾选后可以显著减少法线偏移。如果在Marmoset Toolbag中查看正常而在引擎中出错,应优先检查模型的切线导入设置和法线贴图的Y轴方向是否翻转。
不同平台的贴图分辨率需要提前规划。移动端为了控制显存与带宽,通常使用1024或512分辨率;PC端可使用2048;影视特写镜头偶尔使用4096。AO贴图变化频率较低,可以适当降低分辨率或合并到金属度、粗糙度贴图的通道中。法线贴图对分辨率最敏感,建议与BaseColor保持相同或更高一档。烘焙完成后,应在目标引擎中使用实际光照环境进行最终验证,避免工具预览与实机表现出现较大偏差。只有经过完整流程验证,烘焙贴图才能在性能与画面效果之间取得稳定平衡。