news 2026/9/24 13:36:05

烘焙后城市场景满是黑斑?用6步检查 Lightmap UV 与光照接缝

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
烘焙后城市场景满是黑斑?用6步检查 Lightmap UV 与光照接缝

城市场景完成光照烘焙后,如果出现整面发黑、局部脏斑、模块接缝发亮,先不要急着提高灯光强度。更常见的原因是 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 是否重叠。两个不同的模型面写入同一片光照贴图区域时,烘焙器无法为它们保存独立的光影信息。

三类高频问题

  1. 镜像重叠:左右墙面共用一组镜像 UV;
  2. 堆叠重叠:复制墙体或模块时,连同光照 UV 一起原样复制;
  3. 越界:UV 岛超出有效的 0—1 空间,或者在打包时被错误裁切。

两块相同墙体可以共享材质纹理,但用于烘焙的 UV 仍要有独立区域。不要把第一套材质 UV 直接复制成光照 UV 后就开始烘焙。

检查方法

在 DCC 或引擎的 UV 视图中,只显示用于光照烘焙的 UV 通道。逐个检查主楼、道路、重复墙体和屋顶,确认 UV 岛没有重叠、没有越界,并且每个参与烘焙的面都能找到对应区域。

自动生成 Lightmap UV 可以作为起点,但不能代替验收。屋檐、门窗凹槽、栏杆和道路转角等复杂区域,仍可能因为原始切缝不足而得到不理想的自动布局。

模型经过复制、合并、重新三角化或重新导入后,要再次检查,不能只看源文件。

第三步:检查 UV 岛间距,也就是 Padding

UV 没有重叠,边缘仍然发黑或串色,通常要继续检查岛间距。

UV 岛是展开后的独立面片,Padding 是岛与岛之间预留的空白。分辨率降低、生成 Mip 或执行纹理压缩后,边缘像素可能向外扩散;如果两个岛靠得太近,一个面的暗部就可能污染另一个面。

典型表现

  • 墙体外沿出现一圈脏色;
  • 道路与建筑交界出现不自然暗线;
  • 屋顶边缘与立面之间漏光或串色;
  • 提高分辨率后问题减轻,但仍会在远处或低画质下出现。

做一组小范围对照

  1. 关闭引擎自动生成,使用模型现有的光照 UV;
  2. 开启自动生成,以相同模型重新打包 UV;
  3. 只保留主楼和一段道路进行小范围烘焙;
  4. 在相同灯光、分辨率和压缩设置下比较边缘。

如果重新打包后黑边明显减少,原布局很可能存在间距不足或空间利用失衡。先修 UV 结构,再决定是否提高分辨率。直接把整个城市的分辨率拉高,只会增加烘焙时间、图集数量和显存占用。

Padding 没有脱离分辨率的万能数值。应根据目标光照贴图尺寸、压缩方式和引擎规则计算,并在目标画质下复测。

第四步:按对象尺寸和画面重要性分配分辨率

小屋顶很清楚,主楼却满是块状阴影,通常说明光照像素分配失衡。

主楼占据较大画面面积,立面又包含窗框、阳台和凹槽。如果只获得很少的光照像素,阴影就会被压缩成粗大的色块。相反,远处很少被看到的小模块如果使用过高分辨率,会浪费图集空间和显存。

检查三个指标

  • 对象的世界尺寸;
  • 对象在光照图集中的覆盖面积;
  • 玩家常见视角下,关键表面实际获得的像素密度。

可以使用“每米获得多少光照像素”作为比较指标,但最终仍要结合观察距离、屏幕占比和阴影复杂度判断。

调整顺序

优先保证主楼正面、道路交叉处和玩家经常接近的墙面。远景屋顶、背景墙体和不重要的背面可以降低密度。

每次只调整一个对象或一组同类资产,并记录光照贴图数量、烘焙时间、显存和运行帧时间。这样才能判断画质改善来自哪里,也能避免用全局高分辨率掩盖局部错误。

第五步:修复薄面、法线和模块接缝

单个模型正常,拼成街区后接缝发亮,问题通常出在模块边界。

AI 生成或自动处理的场景模块可能包含零厚度平面、反向面、重叠面,也可能在拼接后留下微小缝隙。相邻模块的顶点、法线或 Lightmap UV 边界不一致,也会形成明显的亮暗断层。

法线可以理解为表面的朝向数据。法线方向错误,渲染器就可能按照错误方向计算受光;零厚度或重叠表面,则容易造成漏光、阴影冲突和闪烁。

重点检查

  • 道路是否只是零厚度单面;
  • 墙体是否存在反向面或错误法线;
  • 屋顶与主楼之间是否存在重叠面;
  • 两块墙体的连接处是否有细小缝隙;
  • 相邻模块的边界顶点是否真正对齐;
  • 平滑规则和顶点法线是否一致;
  • Lightmap UV 是否在接缝两侧采用了不合理的切分;
  • 拼接后是否产生共面或近共面表面。

用三组固定截图复查

  1. 正视角:检查接缝处是否出现稳定亮线或黑线;
  2. 斜视角:检查缝隙、重叠面和法线突变;
  3. 低环境光或夜景:放大观察漏光和烘焙阴影。

必要时给道路和墙体补充合理厚度,删除内部重叠面,统一边界顶点与法线。重复墙体也要逐个检查,不能假定同一网格的所有实例都具有相同的变换和烘焙条件。

第六步:导出回读,并在目标设备复测

资产从生成环境进入 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 通道、烘焙边界、光照密度和运行成本仍需单独验收。“白模变成成品”只能说明视觉阶段发生了变化,不能代替真实场景测试。

你的场景更常出现整面发黑、模块接缝发亮,还是提高分辨率后显存突然上涨?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 13:35:49

Ceph 三大存储接口之 RGW 对象存储深度梳理

Ceph 对象存储基于 Ceph RADOS Gateway(RGW),Ceph 实现兼容 S3、Swift 协议的对象存储,无需修改底层 RADOS 集群,对外提供 HTTP/HTTPS 对象访问能力。一、什么是 Ceph 对象网关 RGW RGW(RADOS Gateway&…

作者头像 李华
网站建设 2026/9/24 13:35:17

十大排序算法之快速排序

一.概念:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列…

作者头像 李华
网站建设 2026/9/24 13:34:18

【DvAdmin】写个脚本更新云端前后端服务

在现代软件开发中,前后端代码更新和部署是常见的操作。然而,传统的手动更新过程繁琐且耗时,极大地影响了开发效率。通过Python脚本实现自动化,能够简化这些操作,显著提升工作效率和项目部署的便捷性。 本文将展示如何利用Python中的paramiko库编写自动化脚本,帮助开发者…

作者头像 李华
网站建设 2026/9/24 13:34:00

【Dv2Admin】自定义审批流程数据验证和用户交互

在当今的数字化时代,企业的高效运作和用户友好性在很大程度上依赖于管理系统的设计与实现。其中,自定义审批流程作为管理系统中的核心功能,其精确、灵活且易用的实现变得尤为重要。 本文将探讨如何通过Django和Vue.js框架的结合,构建一个高效、直观的审批流程管理系统。通…

作者头像 李华
网站建设 2026/9/24 13:33:42

【Dv2Admin】dvadmin用户功能基础models解析

在现代软件开发中,数据模型的设计和管理直接决定了系统的可扩展性、性能和维护成本。尤其在基于Django-Vue-Admin框架的项目中,数据模型的合理设计更是确保系统稳定高效运行的关键。本文将重点介绍项目中核心数据模型的实现,包括Users、Post、Role、Dept、Menu、MenuButton、…

作者头像 李华
网站建设 2026/9/24 13:33:32

增加F110 付款方式的随手记录

随便记录一下,基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码,需要先在DEV,QAS 改成4 外部给号 主要都是在FBZP

作者头像 李华