城市场景完成光照烘焙后,如果出现整面发黑、局部脏斑、模块接缝发亮,先不要急着提高灯光强度。更常见的原因是 Lightmap UV 重叠、UV 岛间距不足、光照贴图分辨率与对象尺寸不匹配,以及薄面、法线或模块边界存在问题。
本文用一个最小场景演示排查顺序:一栋主楼、一段道路、两块重复墙体和一个屋顶。它们从 AI 生成的白模模块开始,经过材质、碰撞和细节补充后进入实时引擎,并在光照烘焙阶段集中暴露问题。
图注:图片可以表达街区从白模到成品的制作方向,但不能证明存在真实可编辑场景,也不能证明 Lightmap UV、烘焙阴影或运行性能已经通过验收;画面中的“Validate”不是测试结果。
先分清两种 UV:材质 UV 不等于 Lightmap UV
UV 可以理解为把三维模型表面摊到二维平面上的坐标。
材质 UV 决定砖墙、玻璃和道路纹理如何排列。为了复用纹理,多个模型面可以共享或重叠同一片材质 UV。例如,两块外观相同的墙体可以使用相同的砖墙区域。
Lightmap UV 用于记录烘焙后的光照信息。由于不同模型面接收到的光照和阴影通常不同,它们一般需要独立的 UV 空间,不能随意重叠;UV 岛之间还要保留足够间距,防止烘焙、压缩或 Mip 采样时互相污染。
可以把材质 UV 想成重复铺设的墙纸,把 Lightmap UV 想成给每块墙单独拍摄的光影照片。墙纸可以复用,光影却必须对应具体表面。
关于无重叠 UV、岛间距、光照贴图分辨率和错误着色,可以参考 Epic 官方的《理解虚幻引擎中的光照贴图》。不同引擎的界面和通道名称并不完全一致,但排查逻辑相同:烘焙数据必须拥有明确、稳定且可采样的二维空间。
第一步:固定烘焙基线,记录第一次出错的位置
同一个模型有时正常、有时发黑,往往是测试条件发生了变化。如果引擎版本、光照模式、贴图压缩、静态标记或烘焙质量同时改变,就很难判断黑斑来自模型还是设置。
先记录这些信息
- 引擎、渲染管线和构建版本;
- 烘焙器、光照模式与质量档位;
- 光照贴图分辨率、图集上限和压缩设置;
- 主楼、道路、墙体、屋顶是否参与烘焙;
- 主光方向、颜色、强度和环境光设置;
- 首次出现异常的对象名称、材质槽和世界坐标。
不要只写“场景里有黑块”。例如,可以记录为:“主楼东侧墙面,坐标约为(120,0,48),烘焙后出现固定矩形黑斑。”描述越具体,后续越容易复现。
建立对照场景
给场景临时换成中性灰材质,固定一盏主光,关闭会干扰判断的后处理。分别保留全景截图和局部截图,至少覆盖主楼正面、道路与墙体交界、屋顶边缘,以及两块重复墙体的连接处。
第一步不负责修复,只负责让问题能够在同一条件下重复出现。后续每次只修改一个变量,并保留烘焙前后记录。
第二步:检查 Lightmap UV 重叠、镜像和越界
某一块表面出现形状稳定的黑斑,首先要检查 Lightmap UV 是否重叠。两个不同的模型面写入同一片光照贴图区域时,烘焙器无法为它们保存独立的光影信息。
三类高频问题
- 镜像重叠:左右墙面共用一组镜像 UV;
- 堆叠重叠:复制墙体或模块时,连同光照 UV 一起原样复制;
- 越界:UV 岛超出有效的 0—1 空间,或者在打包时被错误裁切。
两块相同墙体可以共享材质纹理,但用于烘焙的 UV 仍要有独立区域。不要把第一套材质 UV 直接复制成光照 UV 后就开始烘焙。
检查方法
在 DCC 或引擎的 UV 视图中,只显示用于光照烘焙的 UV 通道。逐个检查主楼、道路、重复墙体和屋顶,确认 UV 岛没有重叠、没有越界,并且每个参与烘焙的面都能找到对应区域。
自动生成 Lightmap UV 可以作为起点,但不能代替验收。屋檐、门窗凹槽、栏杆和道路转角等复杂区域,仍可能因为原始切缝不足而得到不理想的自动布局。
模型经过复制、合并、重新三角化或重新导入后,要再次检查,不能只看源文件。
第三步:检查 UV 岛间距,也就是 Padding
UV 没有重叠,边缘仍然发黑或串色,通常要继续检查岛间距。
UV 岛是展开后的独立面片,Padding 是岛与岛之间预留的空白。分辨率降低、生成 Mip 或执行纹理压缩后,边缘像素可能向外扩散;如果两个岛靠得太近,一个面的暗部就可能污染另一个面。
典型表现
- 墙体外沿出现一圈脏色;
- 道路与建筑交界出现不自然暗线;
- 屋顶边缘与立面之间漏光或串色;
- 提高分辨率后问题减轻,但仍会在远处或低画质下出现。
做一组小范围对照
- 关闭引擎自动生成,使用模型现有的光照 UV;
- 开启自动生成,以相同模型重新打包 UV;
- 只保留主楼和一段道路进行小范围烘焙;
- 在相同灯光、分辨率和压缩设置下比较边缘。
如果重新打包后黑边明显减少,原布局很可能存在间距不足或空间利用失衡。先修 UV 结构,再决定是否提高分辨率。直接把整个城市的分辨率拉高,只会增加烘焙时间、图集数量和显存占用。
Padding 没有脱离分辨率的万能数值。应根据目标光照贴图尺寸、压缩方式和引擎规则计算,并在目标画质下复测。
第四步:按对象尺寸和画面重要性分配分辨率
小屋顶很清楚,主楼却满是块状阴影,通常说明光照像素分配失衡。
主楼占据较大画面面积,立面又包含窗框、阳台和凹槽。如果只获得很少的光照像素,阴影就会被压缩成粗大的色块。相反,远处很少被看到的小模块如果使用过高分辨率,会浪费图集空间和显存。
检查三个指标
- 对象的世界尺寸;
- 对象在光照图集中的覆盖面积;
- 玩家常见视角下,关键表面实际获得的像素密度。
可以使用“每米获得多少光照像素”作为比较指标,但最终仍要结合观察距离、屏幕占比和阴影复杂度判断。
调整顺序
优先保证主楼正面、道路交叉处和玩家经常接近的墙面。远景屋顶、背景墙体和不重要的背面可以降低密度。
每次只调整一个对象或一组同类资产,并记录光照贴图数量、烘焙时间、显存和运行帧时间。这样才能判断画质改善来自哪里,也能避免用全局高分辨率掩盖局部错误。
第五步:修复薄面、法线和模块接缝
单个模型正常,拼成街区后接缝发亮,问题通常出在模块边界。
AI 生成或自动处理的场景模块可能包含零厚度平面、反向面、重叠面,也可能在拼接后留下微小缝隙。相邻模块的顶点、法线或 Lightmap UV 边界不一致,也会形成明显的亮暗断层。
法线可以理解为表面的朝向数据。法线方向错误,渲染器就可能按照错误方向计算受光;零厚度或重叠表面,则容易造成漏光、阴影冲突和闪烁。
重点检查
- 道路是否只是零厚度单面;
- 墙体是否存在反向面或错误法线;
- 屋顶与主楼之间是否存在重叠面;
- 两块墙体的连接处是否有细小缝隙;
- 相邻模块的边界顶点是否真正对齐;
- 平滑规则和顶点法线是否一致;
- Lightmap UV 是否在接缝两侧采用了不合理的切分;
- 拼接后是否产生共面或近共面表面。
用三组固定截图复查
- 正视角:检查接缝处是否出现稳定亮线或黑线;
- 斜视角:检查缝隙、重叠面和法线突变;
- 低环境光或夜景:放大观察漏光和烘焙阴影。
必要时给道路和墙体补充合理厚度,删除内部重叠面,统一边界顶点与法线。重复墙体也要逐个检查,不能假定同一网格的所有实例都具有相同的变换和烘焙条件。
第六步:导出回读,并在目标设备复测
资产从生成环境进入 DCC,再进入 Unity、Unreal 或其他实时引擎时,可能发生重新三角化、单位缩放、法线重算、材质槽合并或 UV 通道变化。源软件中正常,不代表交付文件仍然正常。
导出前固定这些内容
- 最终三角化结果;
- 场景单位与对象缩放;
- 法线和硬边设置;
- 用于烘焙的独立 UV 通道;
- 对象名称、材质槽与模块层级。
导出后,把文件重新导入一个空场景。检查光照 UV 通道是否保留、材质槽和对象合并是否变化,再使用与基线相同的设置做一次小范围烘焙。
需要把资产从生成环境流转到 DCC 或引擎时,可以通过 DCC 桥衔接后续工作流。但资产能够传递,不等于 Lightmap UV、烘焙结果和目标设备性能已经通过验收。
不要混用 Unity 与 Unreal 的通道名称
Unity 的脚本 API 使用Mesh.uv2保存烘焙光照 UV,界面和文档中也可能按从零开始的通道序号称其为 UV1。具体规则可参考 Unity 官方《生成光照贴图 UV》。
Unreal Engine 则通过 Lightmap Coordinate Index 指定用于光照贴图的 UV 通道。不要只记“第二套 UV”这个口号,应直接核对目标引擎实际使用的通道索引。
无论采用哪一种命名,验收重点不变:光照 UV 是否独立、是否位于有效空间、是否无重叠,以及岛间距能否满足目标分辨率和过滤方式。
六步验收表
| 步骤 | 检查对象 | 主要检查项 | 需要记录 | 通过标准 |
|---|---|---|---|---|
| 1. 固定基线 | 主楼、道路、墙体、屋顶 | 引擎版本、光照模式、静态标记、异常坐标 | 全景与局部截图 | 测试条件固定,异常可以重复出现 |
| 2. 检查重叠 | 所有参与烘焙的模型 | 重叠、镜像、堆叠、越界 | 对象名、通道、异常面 | UV 岛无意外重叠,位于有效空间 |
| 3. 检查间距 | 主楼、道路和接缝模块 | Padding、Mip 与压缩污染 | 分辨率、黑边位置、对照截图 | 目标画质下边缘不串色 |
| 4. 分配分辨率 | 主楼正面、屋顶、道路 | 世界尺寸、图集占比、像素密度 | 图集数量、显存、烘焙时间 | 重要区域清晰,成本符合预算 |
| 5. 修复接缝 | 道路与墙体边界 | 法线、厚度、重复面、顶点位置 | 正视、斜视、夜景截图 | 无明显漏光、亮缝、黑线和穿插 |
| 6. 导出复测 | 导出后的空场景 | UV 通道、三角化、单位、材质槽 | 导入前后对照、目标设备数据 | 回读一致,目标设备复测通过 |
只在编辑器中看到正确结果,不能勾选“目标设备通过”;只有静态图片而没有真实工程,也应把运行项标为“待验证”。
黑斑不是一个“把灯调亮”的问题
城市场景烘焙出现黑斑时,不要先把灯光强度和全局分辨率一起提高。这样可能暂时掩盖问题,却会增加烘焙时间、图集数量、显存和运行成本。
更可靠的顺序是:固定基线,检查 Lightmap UV 重叠和岛间距,按对象尺寸分配分辨率,再处理薄面、法线与模块接缝,最后导出回读并在目标设备复测。
AI 生成的街区和建筑模块可以作为制作起点,但 UV 通道、烘焙边界、光照密度和运行成本仍需单独验收。“白模变成成品”只能说明视觉阶段发生了变化,不能代替真实场景测试。
你的场景更常出现整面发黑、模块接缝发亮,还是提高分辨率后显存突然上涨?