1. 场景烘焙前的准备工作
第一次接触Unity场景烘焙时,我被那些黑斑、锯齿和内存爆满的问题折磨得够呛。后来才发现,90%的烘焙问题都源于前期准备不足。就像盖房子要打地基一样,烘焙前的准备工作直接决定了最终效果的质量。
首先要在Player Settings面板中将颜色空间设置为线性(Linear)。这个设置对PBR材质的表现至关重要,很多新手容易忽略。我遇到过不少案例,明明材质参数都调对了,但渲染效果就是不对,最后发现都是颜色空间设置的问题。
导入房间模型时有个关键细节:外部墙体要用单面建模,只保留内壳。很多网上下载的模型都是双面墙体,这会导致烘焙时产生奇怪的光照穿透现象。我建议在3D建模软件中就处理好这个问题,或者在Unity里用ProBuilder工具快速修改。
材质处理是前期最耗时的环节。所有静态物体的材质都需要在Inspector面板中统一设置。这里有个实用技巧:可以创建一个材质预设库,把常用的材质参数保存下来,下次直接调用。比如金属材质的Metallic和Smoothness值,木地板的粗糙度参数等。
2. 无光照渲染阶段
无光照渲染就像素描的底稿,为后续的光照计算打下基础。这个阶段要做的第一件事就是把所有静态物体设置为Static模式。注意不是简单勾选Static复选框,而是要正确设置Static Flags。我一般会把Contribute GI和Occluder Static都勾上。
接下来是个反直觉的操作:删除场景中所有光源。是的,你没看错,就是全部删除。很多新手会保留默认的平行光,结果导致后续烘焙出现各种奇怪问题。我建议创建一个全新的空场景来开始烘焙流程,避免残留光源干扰。
天空盒的选择也有讲究。普通天气的天空盒(比如"Default-HDR Sky")是最安全的选择。避免使用那些高对比度的特殊天空盒,它们会导致烘焙光照不均匀。我曾经用一个暴雨天空盒做测试,结果场景里到处都是不自然的明暗对比。
在Lighting面板中(Window->Rendering->Lighting Setting),有几个关键参数需要设置:
- Environment Lighting的Source设为Skybox
- Environment Reflections的Resolution设为64或128即可
- Baked Global Illumination一定要勾选
3. 环境光遮蔽与反射探针
环境光遮蔽(AO)是让场景产生立体感的关键。勾选Ambient Occlusion后,建议把Max Distance设为0.5-1米之间,太高会导致阴影过重。Indirect Contribution保持在1就行,Direct Contribution可以适当降低到0.5左右。
反射探针(Reflection Probe)的放置位置很重要。我的经验是在房间中心放一个,然后在每个角落各放一个,范围设置为刚好覆盖整个房间。记得把Type设为Baked,Quality设为128就足够了,没必要太高。
这里有个实用技巧:可以创建一个空的GameObject作为探针的父物体,这样调整位置时能保持整体协调。我还会给探针加上"Probe Volume"组件,这样能更精确地控制影响范围。
烘焙参数设置:
- Lightmapper建议用Progressive CPU(稳定性最好)
- Direct Samples设为200-300
- Indirect Samples可以高一些,400-500
- Bounces一般3-4次就够了
4. 材质贴图的深度处理
材质贴图的处理直接决定了最终视觉效果。标准PBR材质需要以下几张贴图:
- _albedo对应基础色
- _ao对应环境光遮蔽
- _height对应高度图
- _normal对应法线贴图
- _roughness和_metallic需要特殊处理
粗糙度贴图(_roughness)的处理是个难点。需要在PS中先反相(Image->Adjustments->Invert),然后复制到_metallic贴图的Alpha通道。如果没有_metallic贴图,可以用纯黑图片代替。
具体操作步骤:
- 在PS中打开_roughness贴图,Ctrl+A全选,Ctrl+C复制
- 打开_metallic贴图,为Metallic图层添加蒙版
- Alt+点击蒙版进入编辑模式
- Ctrl+V粘贴反相后的roughness贴图
- 保存为PNG格式
材质球中的Metallic参数设置:
- 金属部分设为1
- 非金属部分设为0
- 半金属材质(如旧金属)可以设0.3-0.7
5. 光源设置与优化
窗户光线的模拟要用面光源(Area Light)。位置要紧贴窗户,大小略大于窗框。我的经验值是:
- 强度(Intensity):3-5
- 颜色:偏蓝的日光色(约6500K)
- 范围(Range):比房间对角线略长
小型氛围灯可以用自发光材质实现。新建材质球后:
- 勾选Emission
- 照明方式设为Baked
- HDR参数强度设为1-1.5
- 颜色根据场景氛围调整
常见光源问题排查:
- 光线分界线明显:增大Range值
- 光线穿透墙壁:检查墙体是否为单面
- 局部过亮:降低Indirect Multiplier
- 阴影锯齿:提高光源的Shadow Resolution
6. 烘焙问题排查指南
内存错误是最常见的问题之一。如果遇到'Bake Indirect' job failed错误,说明GI缓存爆了。解决方法:
- 进入Edit->Preference->GI Cache
- 点击Clean Cache清除缓存
- 适当增大缓存大小(建议10GB以上)
黑斑问题通常有三种原因:
- 模型没有光照贴图UV:在模型Import Settings中勾选"Generate Lightmap UVs"
- 采样不足:提高Lightmapper的Direct/Indirect Samples
- 模型UV比例太小:调整Scale in Lightmap参数
锯齿问题的解决方法:
- 选中问题模型
- 在Mesh Renderer组件中找到Lightmapping
- 将Scale in Lightmap值从1提高到3-5
- 重新烘焙
UV重叠检测脚本:
using UnityEngine; using System.Collections; public class UVChecker : MonoBehaviour { public void FindOverlappingUVs() { MeshFilter[] meshes = FindObjectsOfType<MeshFilter>(); foreach(MeshFilter mf in meshes) { Vector2[] uvs = mf.mesh.uv; HashSet<Vector2> uvSet = new HashSet<Vector2>(); bool hasOverlap = false; foreach(Vector2 uv in uvs) { if(!uvSet.Add(uv)) { Debug.Log("重叠UV发现于: " + mf.gameObject.name); hasOverlap = true; break; } } if(!hasOverlap) { Debug.Log(mf.gameObject.name + " UV检查通过"); } } } }7. 后期处理技巧
Post Processing插件的使用能大幅提升最终效果。我的常用配置:
- Bloom:阈值1.5,强度0.5
- Color Grading:适当提高对比度和饱和度
- Ambient Occlusion:半径0.5,强度1
- Screen Space Reflections:中等质量
避免过度使用后期效果。我曾经在一个项目中加了太多特效,结果不仅帧率下降,场景还失去了自然感。记住:好的光照烘焙应该只需要轻微的后期修饰。
性能优化建议:
- 光照贴图分辨率2048足够大多数场景
- 使用Texture Compression
- 关闭不必要的实时阴影
- 合理设置LOD层级
8. 工作流程优化建议
建立系统化的烘焙流程能节省大量时间。我的标准流程是:
- 周一:模型和材质准备
- 周二:基础光照设置
- 周三:第一次烘焙测试
- 周四:问题修复和优化
- 周五:最终烘焙和后期处理
版本控制很重要。每次重大修改前,我都会保存一个场景副本。命名规则如"SceneName_BAKED_v1"、"SceneName_BAKED_v2"等。
团队协作时,建议使用Unity的Preset功能保存所有关键设置,包括:
- Lighting Settings
- Quality Settings
- Player Settings
- Post Processing Profile
最后记住,光照烘焙既是技术也是艺术。参数可以标准化,但审美需要不断练习。多观察现实世界的光影效果,拍照记录各种光照条件下的场景,这些都会成为你宝贵的参考资料。