1. 项目概述:为什么我们需要“烘焙大法”?
如果你同时涉足Blender和Unity,那你一定遇到过这个让人头疼的问题:在Blender里精心调制的、充满细节的PBR材质,一旦导出为FBX或GLTF格式导入Unity,效果就大打折扣,甚至面目全非。高光不见了,复杂的混合节点失效了,只剩下一个孤零零的、平平无奇的Standard Shader材质球。这背后的核心矛盾,是着色器语言与渲染管线的差异。Blender使用基于节点和Cycles/Eevee渲染引擎的着色器系统,而Unity则使用其自带的ShaderLab语言和URP/HDRP/Built-in渲染管线。两者在底层实现、参数命名和功能支持上并不互通。
“烘焙大法”正是解决这一痛点的核心策略。它的核心思想是:将Blender中那些无法被Unity原生支持的、复杂的、实时的着色器效果,预先计算并“固化”到一张或多张纹理贴图上。这些纹理贴图(如漫反射贴图、法线贴图、环境光遮蔽贴图、金属度/粗糙度贴图等)是通用的图像数据,可以被任何3D引擎读取和渲染。通过这种方式,我们牺牲了材质在目标引擎中的实时可调性(比如动态改变粗糙度),换来了视觉效果的完美复现和跨平台渲染的一致性。这对于需要将高质量美术资产从DCC工具(如Blender)迁移到实时引擎(如Unity、Unreal Engine,甚至Web端的Three.js)的项目来说,是至关重要的一环。无论是独立开发者、技术美术,还是小型工作室,掌握这套流程都能极大提升美术管线效率,避免在引擎中重复劳动。
2. 核心思路拆解:从节点网络到纹理贴图
在动手之前,我们必须理清思路。Blender的着色器节点网络功能强大,但并非所有节点都适合或需要烘焙。我们的目标是识别并提取那些对最终视觉效果贡献最大的“静态”信息。
2.1 识别可烘焙与不可烘焙的元素
首先,我们需要对Blender的节点进行归类:
高度可烘焙的“静态”信息:
- 基础颜色/漫反射:这是最直接的,通常由
Image Texture节点或ColorRamp等节点输出的固定颜色信息。 - 法线细节:无论是通过
Bump节点、Normal Map节点还是Displacement节点生成的表面凹凸细节,都可以烘焙成一张法线贴图。这是提升模型表面细节的关键。 - 环境光遮蔽:虽然可以在引擎中实时计算,但预先烘焙的AO贴图质量更高、性能消耗为零,能极大地增强模型的体积感和角落阴影。
- 金属度与粗糙度:对于PBR工作流,这两个参数定义了材质的光泽特性。如果它们在Blender中是固定的或由纹理驱动,就可以烘焙成单独的贴图(或合并到一张贴图的G、B通道)。
- 自发光/发光:固定的发光颜色和强度可以烘焙成一张自发光贴图。
- 不透明度:用于制作树叶、栅栏等透明效果,可以烘焙成Alpha贴图。
- 基础颜色/漫反射:这是最直接的,通常由
难以或无法烘焙的“动态”效果:
- 程序化纹理的UV动画:例如,通过
Mapping节点驱动的、随时间滚动的纹理。烘焙会将其定格在某一帧。 - 基于顶点颜色或对象信息的动态混合:例如,根据顶点位置混合雪地和泥土。烘焙需要固定的输入状态。
- 复杂的次表面散射:实时引擎中的SSS效果通常有简化模型,直接烘焙其颜色结果可能不准确。
- 视差遮蔽映射等高级效果:这些高度依赖着色器实时计算。
- 程序化纹理的UV动画:例如,通过
实操心得:一个简单的判断原则是,问自己:“这个效果在游戏运行时会变化吗?”如果答案是“不会”,那么它大概率可以且应该被烘焙。烘焙的本质是预计算。
2.2 烘焙工作流全景图
整个“烘焙大法”的流程可以概括为以下四个核心阶段,我将用一个制作生锈金属管的案例贯穿始终:
- Blender端:材质准备与烘焙设置。确保模型UV展开良好,在Blender中设置好Cycles渲染引擎和烘焙参数,选择正确的烘焙类型并输出贴图。
- 纹理后处理。从Blender烘焙出的贴图通常是“原始”的,可能需要进行色彩空间转换、降噪、锐化、打包(如将金属度和粗糙度合并到一张贴图的特定通道)等操作,通常在Photoshop、GIMP或专为游戏美术设计的工具(如Materialize、ArmorPaint)中完成。
- Unity端:材质球重构。在Unity中创建新的材质球(通常使用URP/Lit或HDRP/Lit),将处理好的贴图对号入座,连接到对应的材质属性槽中。
- 调试与优化。在Unity的特定光照环境下对比效果,微调材质参数(如平滑度、法线强度),并考虑纹理压缩和Mipmap设置以优化性能。
3. 核心细节解析与实操要点
3.1 UV展开:一切烘焙的基石
无论你的模型多复杂,材质多精美,如果UV展开得一团糟,烘焙出的贴图就无法使用。这是烘焙流程中最容易踩坑、也最需要耐心的一步。
- 为什么UV如此重要?烘焙过程本质上是将3D模型表面的信息(颜色、法线等)“投影”到2D的UV空间,生成纹理贴图。如果UV岛存在重叠、拉伸严重或像素密度不均,就会导致纹理错乱、细节丢失或浪费纹理分辨率。
- 关键操作与参数:
- 进入UV编辑工作区:在Blender中,切换到
UV Editing布局。 - 智能UV投射:对于简单或有机模型,
U->Smart UV Project是一个快速的起点。调整Angle Limit和Island Margin(岛屿间隔)以获得更合理的分割。 - 手动拆解与排布:对于硬表面或复杂的机械模型,通常需要手动标记缝合边(
Mark Seam),然后U->Unwrap。使用Pack Islands功能自动排列UV岛,务必确保没有重叠,并尽量利用UV象限的空间,保持各部分的像素密度相对一致。
- 进入UV编辑工作区:在Blender中,切换到
- 检查工具:在
UV菜单下开启Stretch显示模式,蓝色表示无拉伸,红/黄色表示有拉伸,需要调整。
踩坑记录:我曾为一个复杂的机甲模型烘焙法线贴图,结果在引擎中某些部位的法线完全错乱。排查了半天,才发现是一个不起眼的螺丝零件的UV岛和主体装甲的UV岛有微小重叠。Blender烘焙时不会报错,但重叠区域的像素信息会互相覆盖,导致无法预料的结果。烘焙前,请务必在UV编辑器中以“检查器”般的严谨度,逐一确认所有UV岛均无重叠。
3.2 Blender烘焙设置详解
Blender的烘焙面板选项繁多,理解每个参数的含义是成功的关键。
- 切换到Cycles渲染引擎:在
Render Properties面板中,将渲染引擎从Eevee切换到Cycles。Cycles是光线追踪渲染器,烘焙质量更高、更准确。Eevee的烘焙功能有限且可能不准确。 - 选择烘焙类型:在
Render Properties->Bake部分,找到Bake Type下拉菜单。这是我们工作的核心:- Diffuse:烘焙纯颜色信息,不含光照。通常选择
Color通道(排除Direct和Indirect光照)。 - Normal:烘焙法线贴图。这是最常用的一种。关键步骤:你需要一个单独的、高精度的“烘焙用高模”和一个低模。将高模作为
Selected to Active中的目标,低模作为活动对象。在材质中,高模需要有一个Bake节点(Add->Input->Texture Coordinate->Bake),并将其Vector输入连接到法线贴图节点。 - Ambient Occlusion:烘焙环境光遮蔽。调整
Distance参数控制AO的采样范围,影响阴影的“深浅”和“范围”。 - Roughness / Glossiness:如果你的材质有粗糙度或光泽度贴图,可以单独烘焙。
- Emission:烘焙自发光。
- Diffuse:烘焙纯颜色信息,不含光照。通常选择
- 关键参数解析:
- Margin:在UV岛边缘扩展的像素数,用于防止接缝。对于法线贴图,通常需要较大的Margin(如16px),因为法线信息在边缘需要平滑过渡。对于颜色贴图,5-10px通常足够。
- Selected to Active:这是烘焙法线、AO等从高模到低模的必选项。勾选后,先选择高模对象,最后选择低模对象(活动对象),然后点击
Bake。 - Clear Image:烘焙前清除目标图像的所有像素。通常勾选。
- Resolution:输出贴图的分辨率(如1024x1024, 2048x2048)。根据模型在游戏中的重要性(主角/道具/背景)和性能预算决定。
- 输出设置:在
Image Editor中新建一个图像(New),设置好分辨率和名称(如MyModel_Normal)。在烘焙面板的Target中选择Image Textures,并确保该图像被选中。烘焙完成后,记得Image->Save As保存为PNG或TGA格式(避免有损压缩的JPG)。
3.3 纹理后处理:让贴图“引擎就绪”
从Blender直接烘焙出的贴图是“原始数据”,直接丢给Unity可能无法达到最佳效果。
- 色彩空间:这是最常见的坑!Blender的线性工作空间和sRGB的显示方式与引擎的对接需要小心。
- 颜色贴图(Diffuse/Albedo):需要保存为sRGB色彩空间。在Blender中保存为PNG即可,在Unity中导入后,其
Texture Type的sRGB选项应保持勾选(默认)。 - 非颜色数据贴图:法线贴图、金属度贴图、粗糙度贴图、环境光遮蔽贴图、高度贴图等,它们存储的是物理数据,而非视觉颜色。在Unity中,你必须将这些贴图的
sRGB选项取消勾选,并设置正确的Texture Type(如法线贴图选择Normal map,Unity会自动将其转换为引擎内部使用的格式)。如果在Blender中烘焙的法线贴图是“世界空间”或“物体空间”的,你可能还需要在Photoshop中使用插件(如NVIDIA Texture Tools)或在线工具将其转换为“切线空间”,这是游戏引擎最常用的法线贴图格式。
- 颜色贴图(Diffuse/Albedo):需要保存为sRGB色彩空间。在Blender中保存为PNG即可,在Unity中导入后,其
- 贴图打包:为了节省纹理采样次数和内存,我们经常将多张单通道贴图打包到一张RGBA贴图的各个通道中。最常见的打包方式是金属度-粗糙度-环境光遮蔽(MRA)贴图:
- R通道:环境光遮蔽(Ambient Occlusion)
- G通道:粗糙度(Roughness)
- B通道:金属度(Metallic)
- (A通道可以存放其他信息,如高度或自发光) 你可以在Substance Designer/Painter、ArmorPaint或Photoshop中轻松完成这个打包操作。这样在Unity的Shader中,只需要采样一张纹理,然后使用
tex.r,tex.g,tex.b来分别获取AO、粗糙度和金属度值。
4. 完整实操流程:以“生锈金属管”为例
让我们通过一个具体案例,将上述理论串联起来。目标:将一个在Blender中使用了复杂节点模拟锈迹、污渍和凹凸的金属管材质,通过烘焙迁移到Unity URP中。
4.1 Blender端:材质与烘焙
- 模型准备:确保你的低模(游戏中使用)UV已完美展开。准备一个细分过或雕刻过细节的高模(仅用于烘焙法线和AO)。
- 材质设置:在低模上,我创建了一个材质,使用了以下节点组合:
- 基础层:带划痕的金属板纹理,通过
ColorRamp调整对比度,连接到Principled BSDF的Base Color。 - 锈迹层:使用
Noise Texture和Voronoi Texture混合,通过MixRGB节点以Overlay模式叠加到基础层上,模拟锈蚀。 - 法线细节:使用
Noise Texture连接到Bump节点,再连接到Principled BSDF的Normal,模拟表面细微的凹凸不平。 - 粗糙度:金属部分粗糙度低,锈蚀部分粗糙度高,使用一张污渍贴图
MixRGB混合两个Value节点来控制。
- 基础层:带划痕的金属板纹理,通过
- 烘焙法线贴图:
- 选中高模,然后按住Shift加选低模(使低模为活动对象)。
- 在低模的材质中,新建一个
Image Texture节点,点击New创建一张名为Pipe_Normal的2048x2048图像。 - 在
Render Properties->Bake中,设置Bake Type为Normal,勾选Selected to Active,Margin设为16px。 - 点击
Bake按钮。等待完成后,在Image Editor中保存为Pipe_Normal.png。
- 烘焙颜色贴图:
- 在
Bake Type中选择Diffuse,取消勾选Direct和Indirect(只烘焙纯颜色)。 - 确保
Image Texture节点切换到了另一张新建的图像Pipe_Albedo。 - 点击
Bake并保存为Pipe_Albedo.png。
- 在
- 烘焙粗糙度贴图:
- 将
Principled BSDF节点的Roughness输入直接连接到一个单独的Image Texture节点(新建Pipe_Roughness图像)。 Bake Type选择Emit(实际上我们是在烘焙一个单通道的值)。也可以选择Diffuse但只输出一个通道。- 点击
Bake并保存。这张图是黑白的,白色代表粗糙(1.0),黑色代表光滑(0.0)。
- 将
4.2 Unity URP端:材质球重构
- 导入资源:将FBX模型和烘焙好的贴图(
Pipe_Albedo.png,Pipe_Normal.png,Pipe_Roughness.png)导入Unity项目。 - 配置贴图:
- 选中
Pipe_Albedo.png,在Inspector中确保Texture Type为Default,sRGB为勾选状态。 - 选中
Pipe_Normal.png,将Texture Type改为Normal map,Unity会提示“Fix now”,点击它。确保sRGB为取消勾选。 - 选中
Pipe_Roughness.png,将Texture Type设为Single Channel(因为我们只需要一个灰度值),格式可选R 8。同样,取消勾选sRGB。
- 选中
- 创建并配置URP Lit材质球:
- 在Project视图中右键 ->
Create->Material,命名为Mat_Pipe。 - 将材质球的Shader改为
Universal Render Pipeline/Lit。 - 连接贴图:
- 将
Pipe_Albedo拖到Base Map。 - 将
Pipe_Normal拖到Normal Map。 - 将
Pipe_Roughness拖到Smoothness槽位。注意:URP的Smoothness和粗糙度是反义词(Smoothness = 1 - Roughness)。如果你的粗糙度贴图是“越白越粗糙”,那么直接连接后,光滑度会是反的。你需要创建一个简单的反转操作。一种方法是使用Sample Texture 2D节点(在Shader Graph中)采样粗糙度贴图,然后通过One Minus节点连接到Smoothness。如果不用Shader Graph,也可以在导入粗糙度贴图时,在导入设置中勾选Alpha from Grayscale,并在材质球中勾选Smoothness的Invert选项(如果材质有的话),或者手动将Smoothness值设为1 - [贴图采样值]。
- 将
- 调整材质参数:
Surface Type设为Opaque。Metallic可以给一个固定值(如0.8),或者如果你烘焙了金属度贴图,就连接到Metallic。- 根据效果微调
Normal Map的强度(Normal Strength,通常保持1.0)。 - 调整
Smoothness的滑块或连接贴图后的乘数,直到金属的高光反射看起来自然。
- 在Project视图中右键 ->
- 应用与测试:将
Mat_Pipe材质球拖拽到场景中的管道模型上。在不同的光照环境下(白天、夜晚、室内)旋转视角观察,检查法线细节是否清晰,高光反射是否符合金属和锈蚀的物理特性。
5. 常见问题与排查技巧实录
即使流程正确,实践中仍会遇到各种“妖魔鬼怪”。以下是我总结的常见问题速查表:
| 问题现象 | 可能原因 | 排查与解决方案 |
|---|---|---|
| 导入Unity后模型全黑或全白 | 1. 颜色贴图(Albedo)色彩空间错误。 2. 场景光照过暗或没有光照。 3. 材质Shader选错(如用了不兼容的HDRP Shader)。 | 1. 检查颜色贴图的sRGB是否勾选。2. 在场景中创建一个 Directional Light。3. 确认材质使用的是当前渲染管线(URP/HDRP)对应的Lit Shader。 |
| 法线贴图无效或效果怪异 | 1. 法线贴图未设置为Normal map类型。2. 法线贴图的 sRGB未取消勾选。3. 烘焙的法线空间不正确(非切线空间)。 4. UV有重叠或严重拉伸。 | 1. 在导入设置中正确设置Texture Type为Normal map并点击“Fix”。2. 确认 sRGB已关闭。3. 确保在Blender中烘焙法线时, Normal烘焙类型的Space选项选择的是Tangent(切线空间)。如果已经是,尝试在Unity材质中勾选或取消勾选Enable GPU Instancing试试(某些情况下有影响)。4. 回Blender检查UV。 |
| 接缝处出现明显颜色或法线断层 | 1. 烘焙时Margin(边界扩展)值设置过小。2. UV岛在接缝处像素密度不匹配。 | 1. 重新烘焙,增加Margin值(特别是法线贴图,建议16px以上)。2. 尝试在Blender的UV编辑器中,使用 Average Island Scale来均衡各UV岛的缩放比例。 |
| 金属感/高光反射不正确 | 1. 粗糙度/光滑度贴图连接错误或数值反了。 2. 金属度值设置错误或贴图有问题。 3. 环境反射探头(Reflection Probe)未设置或未烘焙。 | 1. 确认粗糙度贴图连接到了材质的Smoothness,并检查是否需要反转(Invert)。用纯黑/纯白测试图测试。2. 对于纯金属, Metallic应设为1或使用全白的金属度贴图。非金属设为0。3. 在场景中放置一个 Reflection Probe,并点击Bake,让金属物体能捕捉到环境反射。 |
| 烘焙出的贴图有奇怪的斑点或噪点 | 1. Cycles渲染器的采样(Samples)值太低。 2. 使用 Eevee进行烘焙(不推荐)。3. 模型面数极高,但贴图分辨率不足。 | 1. 在Blender的Render Properties->Sampling中,提高Render和Viewport的采样值(如128或256),再进行烘焙。2. 务必使用 Cycles引擎进行烘焙。3. 尝试提高烘焙输出贴图的分辨率,或检查高模是否有不必要的细分。 |
| Unity中材质显示为粉色(Missing Shader) | 1. 材质引用的Shader在当前项目中不存在或未加载。 2. 从其他项目导入的材质使用了不同的渲染管线。 | 1. 检查材质球的Shader属性,将其更换为当前项目可用的Shader(如Universal Render Pipeline/Lit)。2. 如果是从Built-in RP项目导入URP项目,需要使用Unity的官方工具进行渲染管线升级转换。 |
独家避坑技巧:
- 烘焙前先“试烤”:在正式烘焙高分辨率贴图前,先将输出分辨率设为256x256,快速烘焙一次小图。用这个低清贴图在Unity中快速搭建材质并检查效果,能提前发现UV、色彩空间、连接错误等根本性问题,避免浪费数小时烘焙高清图后才发现不能用。
- 善用“烘焙到顶点颜色”作为备选:对于极其简单的颜色变化或遮罩,如果觉得展开UV和烘焙贴图太重量级,可以考虑在Blender中将信息烘焙到模型的顶点颜色(Vertex Color)上。在Blender的
Bake类型中选择Diffuse,Target选择Vertex Colors。导入Unity后,可以在Shader Graph中通过Vertex Color节点读取这些信息。这非常适合用于程序化植被的地面融合、简单的污渍遮罩等。但缺点是精度受顶点数限制,且无法承载法线等复杂信息。 - 建立命名规范:为你的贴图文件建立清晰的命名规范,例如:
[AssetName]_[Type]_[Resolution].png(如HeroArmor_Albedo_2K.png,HeroArmor_Normal_2K.png)。在团队协作中,这能节省大量沟通和查找时间。