共计 2212 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么需要 GPU 加速
传统 CPU 光照烘焙(Lightmapping)在 Unity 项目中一直是性能瓶颈。以一个中等规模的室内场景为例:

- CPU 烘焙(如 Progressive CPU)通常需要 30 分钟到数小时
- 迭代成本极高:每次调整光源参数都需要重新烘焙
- 内存占用大:高分辨率光照贴图(Lightmap)可能消耗 10GB+ 内存
GPU 加速的优势显而易见:
- 速度提升 :利用显卡并行计算能力,相同场景烘焙时间可缩短至 1/10
- 实时反馈 :支持交互式参数调整预览
- 资源优化 :GPU 显存直接处理纹理数据,减少主内存交换
技术对比:主流烘焙方案数据实测
| 方案 | 烘焙时间(同场景) | 输出质量 | 硬件要求 |
|---|---|---|---|
| Enlighten | 45 分钟 | ★★☆☆☆ | 低 |
| Progressive CPU | 2 小时 | ★★★★☆ | 高内存 |
| Bakery GPU | 8 分钟 | ★★★★★ | 需支持 ComputeShader |
测试场景:200 万面片室内场景,GTX 1080Ti 显卡
核心实现:GPU 烘焙全流程解析
1. 烘焙贴图生成流程
- UV 展开 :
- 自动生成第二套 UV(Lightmap UV)
-
确保 UV 岛之间留有 2-4 像素间隙(避免边缘渗色)
-
光照计算 :
- 使用 ComputeShader 并行计算直接光照和间接光照
-
每个线程处理一个纹素(Texel)的辐射度(Radiance)
-
降噪处理 :
- 基于 SVGF(时空方差引导滤波)的实时降噪
- 可配置的采样数(Samples)控制噪点程度
2. Compute Shader 并行化
关键代码结构:
// 光照计算核心(BakeryCompute.compute)[numthreads(8, 8, 1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{float3 worldPos = CalculateWorldPos(id.xy);
float3 normal = SampleWorldNormal(id.xy);
// 并行计算蒙特卡洛积分
float3 radiance = 0;
for(int i=0; i<numSamples; i++)
{radiance += TraceRay(worldPos, normal);
}
outputTexture[id.xy] = float4(radiance / numSamples, 1.0);
}
完整代码示例:Unity 集成实战
场景准备
// 确保场景物体满足烘焙条件
void PrepareForBaking()
{
// 1. 静态标记
foreach(var renderer in FindObjectsOfType<Renderer>())
{
renderer.gameObject.isStatic = true;
renderer.lightmapIndex = -1; // 强制重新生成
}
// 2. 层级过滤(排除动态物体)var ignoreLayer = LayerMask.NameToLayer("Dynamic");
Physics.IgnoreLayerCollision(ignoreLayer, ignoreLayer);
}
烘焙配置
// Bakery GPU 参数设置
public BakeryDirectLightmap gpuLightmapper;
void StartBaking()
{
gpuLightmapper.resolution = 40; // 每单位像素数
gpuLightmapper.samples = 256; // 采样数(质量关键)gpuLightmapper.denoiseIterations = 3;
// 自动回退到 CPU 模式
if(!SystemInfo.supportsComputeShaders)
{Debug.LogWarning("GPU not supported, falling back to CPU");
gpuLightmapper.fallbackToCPU = true;
}
gpuLightmapper.Bake(); // 开始烘焙}
性能优化实战技巧
显卡性能参考
| 显卡型号 | 烘焙时间(2048×2048) |
|---|---|
| RTX 3090 | 3 分 12 秒 |
| RTX 2070 | 5 分 45 秒 |
| GTX 1060 | 11 分 30 秒 |
移动端优化
- 纹理压缩 :
- 安卓优先选择 ETC2
- iOS 使用 ASTC 4×4
- 分辨率分级 :
- 远景物体:10-15 texels/unit
- 近景物体:30-40 texels/unit
高频问题避坑指南
Lightmap UV 重叠
症状:烘焙后出现条纹状 artifacts
解决方案:
- 在模型导入设置中勾选 Generate Lightmap UVs
- 手动检查 UV 间距:
// 检查 UV 重叠的快速方法 Mesh mesh = GetComponent<MeshFilter>().sharedMesh; Debug.Log(mesh.uv2.Length == mesh.uv.Length); // 应该为 true
动态物体误烘焙
预防措施:
- 创建专用 Layer(如 “NoBake”)
- 在 Bakery 设置中排除该 Layer:
Lighting Window > Bakery > Culling Mask
延伸思考方向
- 如何结合 DXR 实时光追进行混合烘焙(Hybrid Baking)?
- 在开放大世界中如何实现分块动态烘焙?
- 针对 VR 项目,有哪些特殊的烘焙优化策略?
结语
经过实际项目验证,Bakery GPU Lightmapper 在保证质量的前提下,将我们的烘焙时间从平均 2 小时压缩到 10 分钟以内。特别是在需要频繁调整光照参数的预研阶段,实时反馈的特性显著提升了工作效率。建议初次使用时从小场景开始,逐步熟悉参数对效果的影响曲线。
正文完
