资讯动态

Lightmap UV生成全解析:从烘焙原理到避坑指南

发布时间:2026/10/20 3:12:49 来源:尧图企业网站定制
做游戏开发和3D场景的朋友对Generate Lightmap UVs这个选项应该都不陌生。Unity导入模型时默认就有它虚幻的静态网格体设置里也有Auto Generate Lightmap UVBlender的UV菜单里甚至专门放了个Lightmap Pack。很多人平时就是随手勾上、默认参数一用烘焙结果看着差不多就过去了。直到某天墙角的阴影裂了一条缝、地面的光影精度惨不忍睹才想着要回头弄清楚这套东西到底在干什么。这篇文章就是来讲清楚Lightmap UVs的它是什么、为什么模型非得有这一套、不同工具里怎么正确生成以及生成之后哪些坑你必须躲开。适合正在做烘焙光照、或者刚接触关卡灯光搭建的开发者参考也会涉及一些美术向的检查流程但不需要你有多深的图形学基础。1. 一套UV走天下的痛点为什么非得给光照单独配一套坐标1.1 纹理UV和Lightmap UV的职责完全不同很多初学者第一次看到Generate Lightmap UVs都会困惑模型不是已经有UV了吗还要生成一套什么这里的核心点在于游戏模型通常有两套完全独立的UV坐标。第一套是纹理UV也就是美术在DCC工具里手动或者半自动展好的那一套。它决定的是颜色贴图、法线贴图、粗糙度贴图这些资源怎么从一张2D纹理上取像素覆盖到3D表面。它的目标是让纹理像素密度尽量均匀、接缝尽量藏在不起眼的位置同时兼顾贴图方向、纹理造型的连续感。第二套就是Lightmap UV这套坐标只服务一个用途决定烘焙出来的光照结果以什么样的布局写进一张光照贴图里。它跟颜色贴图没有任何关系可以长得跟第一套完全不同。你可以把纹理UV想象成给模型表面贴墙纸而Lightmap UV则是把模型表面拆开摊平放到一张记录光线的地图上让烘焙器知道这一块表面对应光照图中的这一小片像素。明白这个区别之后后面所有问题就都有了解释。两个UV通道之间存在物理意义上的不同纹理UV追求的是贴图细节不拉伸、接缝少且隐蔽Lightmap UV追求的是每个表面的光照像素密度尽可能一致、UV岛之间有足够的间距避免烘焙时像素串扰。1.2 烘焙光照的工作原理决定了它需要独立的UV布局光照烘焙的原理简单说就是把灯光、间接光、阴影等信息预先计算并固化到一张或一组纹理上运行时不计算实时光只需要采样这些预计算结果。这个预计算过程需要知道模型表面的每一个点应该去光照贴图的哪个位置取颜色。问题来了。烘焙器在计算光照时会沿着表面方向做大量采样如果直接复用第一套纹理UV会遇到几个非常现实的问题。第一第一套UV可能是为了贴图美观而做的岛的密度分布可能极不均匀。角色脸部用了一大片UV背后的披风却只挤在角落一点点。如果把这套UV拿去做光照披风上的光影清晰度就会低得无法接受所有光照细节糊成一团。第二第一套UV常常存在重叠区域。做复杂布料、植被或者一些靠UV重复平铺的模型时UV重叠是常态。烘焙器一旦发现同一个光照贴图像素对应模型表面的多个位置它就无法决定这个像素到底记录哪个点的亮度结果就是一片黑、一片闪完全没法用。类似地当多个物体共享一套纹理时它们的UV往往落在同一个纹理图集上彼此互相挤占光照数据写进去全是串位。第三第一套UV岛之间的边距通常很窄很多贴图就是靠这个连续性来掩盖接缝的。可光照贴图一旦像素在岛边界上互相渗透、采样越界接缝周围就会出现一明一暗的硬边。所以引擎和DCC工具才提供了独立的生成Lightmap UVs功能自动为光照贴图重新规划一套UV布局把所有表面拆成互不重叠的岛尽量均匀地铺满纹理空间岛与岛之间留出足够的安全间距再尽量降低拉伸。1.3 什么场景绕不开Lightmap UV不是说所有项目都必须用Lightmap UV。如果项目走的是纯实时光照路线全都用动态灯光和屏幕空间方案那光照贴图压根用不上自然也不需要这套UV。但这几年移动端、PC端大量项目仍以烘焙光照为主尤其是关卡场景里的静态物体建筑、地面、墙体、道具用烘焙光照在性能上的优势太明显了。还有一类情况也绕不开你需要在静态几何体上呈现高质量的间接光照和阴影细节同时又不想拖累运行时性能。烘焙就是最具性价比的方案。只要走烘焙Lightmap UV就是必需品。哪怕你用的是高版本的全局光照方案场景里的关键静态模型依然要生成合理的第二套UV。2. 生成Lightmap UVs的底层逻辑拆岛、舒展、打包2.1 从网格三角形到UV岛拆分策略与角度阈值几乎所有工具生成Lightmap UV时流程都分三步拆岛、舒展、打包。看起来是人畜无害的自动化流程实际上每一步都在做取舍。拆岛这一步决定了模型表面会被切成多少块每块长什么样。工具遍历网格的所有三角形把相邻且夹角较小的三角形归入同一个岛。这里有个关键参数叫硬边角度一般默认在50到60度左右。两个相邻三角形的法线夹角超过这个阈值工具就认为这里是一个硬棱拆开这里不会导致明显的光影接缝所以在此处断开更划算。如果阈值设得太大比如90度那么一个立方体可能被当成一个巨大的岛直接摊平光照结果在拐角处会非常怪异如果设得太小比如20度整个表面会被碎成密密麻麻的小片打包难度飙升光照图利用率极低。我的经验和很多美术朋友一致默认的60度左右通常够用但圆柱、球体这类曲率连续的弧形模型建议专门测试一下。圆柱侧面的过渡面如果全被拆成细条光照烘焙之后往往会在每个细条边界留下淡淡的竖线这种情况应该适当提高角度阈值把弧形表面尽量合成一个岛。2.2 舒展算法让每个三角形都平摊在纹理上拆完岛之后第二步是把每个岛的三角形通过算法摊开映射到二维平面上。这个过程本质上是一个数学优化问题要让每个三角形在UV空间里的形状尽量等比于它在三维空间里的实际形状减少拉伸和面积变形。常见舒展算法分成几类简单说就是基于角度、基于面积、混合优化三种思路。基于角度的方法保证三角形三个角在UV空间里不变形三角形面积可能会被放大或缩小基于面积的方法反过来尽量保持面积比例一致但可能出现严重的角度剪切。好一点的工具会做混合优化也就是俗称的ABF或LSCM类算法。对Lightmap UV来说我们其实不太关心纹理方向是否美观因为光照贴图没有图案方向这个概念。我们关心的是两件事光照像素密度均匀、表面方向的连续性不被破坏。如果舒展算法把岛内某个局部弄得面积特别大那这一块能获得的光照分辨率就偏高别的地方就偏低整体精度参差不齐。2.3 打包与Padding把所有岛塞进0到1的方格里舒展完成之后所有岛都是二维的接下来要把它们全部塞进0到1的UV空间里。这一步是装箱问题的变体形状不一定全是矩形但要把它们排列得尽量紧密同时让岛与岛之间留出一定间距。间距通常叫Padding单位是像素。比如你的光照贴图是1024x1024Padding设置为4就表示任意两个岛之间至少留4个像素的空白。这个间距太小的直接后果是烘焙器在做像素采样时一个岛边缘的光线会串到隔壁岛的颜色里造成漏光和彩色边缘。间距太大岛上占用的区域就少同等分辨率下光照精度下降。打包里有一个值得一提的细节工具的打包算法尽量让岛的朝向自动旋转90度以节省空间。对光照贴图来说旋转本身不影响烘焙结果因为光照贴图的采样不关心哪个方向是上。但如果你在DCC工具里手动调过岛的方向比如为了配合某些贴图那生成Lightmap UV时务必关闭自动旋转否则光照方向会错位。2.4 UV密度与分辨率的匹配关系密度这个因素是新手最容易忽略的。生成Lightmap UV时很多人只关注有没有生成成功不关注这套UV在4096贴图下能分到多少精度的光照像素。渲染一张灯光柔和的客厅图墙面需要的细节少但桌面上的小物件如果UV摊得太小烘焙完就是一片均匀的颜色完全看不到AO和阴影的层次。UV密度的实际含义是模型表面一个单位面积对应到光照贴图上占多少个像素。业内一般以texels per unit来评估也就是每单位长度多少纹素。假设你的光照贴图是2048x2048模型整个房间都塞在这一个图集里那么所有表面加起来的像素总和是有限的谁摊得多谁光照就清楚。密度过低光影细节全部糊掉密度过高纹理资源浪费烘焙时间暴增。这也是为什么引擎在生成Lightmap UV时通常让你输入目标分辨率或密度值而不只是按生成按钮。你需要根据物体重要程度分配不同密度比如主要角色附近的家具精度高一些远处的背景装饰可以整体降档。把这句话记牢生成Lightmap UV不只是技术操作它同时是一个资源分配决策。3. 实操主流引擎和DCC工具里的生成方法3.1 Unity模型导入器里的Generate Lightmap UVsUnity是最常被人一键操作的地方。选中一个模型资源在Model Importer里勾上Generate Lightmap UVs看似搞定其实下面展开的Parameters一栏才是重点默认配置能用但离好用差得很远。关键参数比较常用的是Hard Angle硬边角度Pack Margin岛间距Angle Error和Area Error舒展时的允许误差还有UV Island Generation的选项。Hard Angle就是前面说的拆岛阈值Pack Margin就是打包间距以像素为单位。Unity会自动根据设定生成第二套UV并写入模型资源里之后在Mesh Renderer/Lightmap Parameters中就能看到对应的UV2被使用。实操中有个常见误区很多人认为只要勾了这个选项光照贴图就自动完美了。实际上Unity默认的Pack Margin很小如果你用4096的光照图默认几个像素的间距容易漏光。我习惯把Pack Margin提高到至少8到16像素对于缝隙明显的硬表面模型可以用到24像素。代价是UV空间利用率下降但视觉干净程度完全是两个档次。还有一个关键点要注意如果模型组件里使用了LOD多级LOD的Lightmap UV建议按不同密度重新生成。把LOD0的高模UV精度调很高LOD2、LOD3的UV精度可以大幅下调反正远景模糊省下光照图空间给近景细节。3.2 UE5自动生成与手动配置虚幻引擎的静态网格体设置里有对应的选项通常叫Auto Generate Lightmap UV但这个自动同样不是万能的。UE里还要注意Lightmap Coordinate Index也就是告诉引擎使用第几套UV作为光照坐标默认一般指向UV1。如果你的模型在DCC里手动展过一次Lightmap UV记得把自动生成关掉直接指定Lightmap Coordinate Index不然引擎再生成一遍可能覆盖掉你的手工布局。UE的Lightmap Resolution参数不直接写在网格体导入里而是在每个静态网格体组件或Lightmass设置里定义。这个分辨率指的是场景中各物体在全局光照图中的像素密度由LOD和距离共同决定。实操中UE针对大型关卡场景最消耗性能的瓶颈往往不是烘焙计算本身而是Lightmap UV数量过多、分辨率过高导致的内存爆炸。一堵长墙如果给到1024的分辨率比一个复杂道具占用的光照图空间还大但视觉上根本不需要那么多细节。所以建议先按物体轴对齐边界框估算密度用一个小测试场景烘焙一遍从结果反推每个物体合适的Lightmap Resolution。3.3 BlenderLightmap Pack与手动修补Blender的UV菜单里有一个叫Lightmap Pack的功能使用方式很简单进入UV Editing工作区全选UV面点击UV菜单里的Lightmap Pack然后调整Margin参数。Blender的Lightmap Pack算法跟引擎里的自动生成逻辑类似也是拆岛、舒展、打包速度很快适合给低模快速生成光照坐标。不过Blender里的Lightmap Pack有一些特性需要留意。它在拆岛时主要基于材质和独立面组很多情况下拆出来的岛偏碎而且不保证所有岛的方向一致。如果你打算在Blender里展好再导出给引擎建议在Blender中先用Seam工具手动标好接缝再用Unwrap展开最后用Pack Islands做一次全局打包这样比直接Lightmap Pack出来的效果好不少。手动修补的场景主要出现在硬表面模型上。自动生成只会按角度阈值拆但有些地方你明知不应该拆比如一整块金属面板中间有道装饰线自动工具在这里断了一口烘焙后就会留一条缝。这种时候唯一的办法就是回到DCC里手动合并或调整接缝然后重新导出。养成承接口永远放在看不见或转折处的建模习惯能省下大量后期修缝的时间。3.4 DCC到引擎的交接注意事项自己制作或外包模型时交接Lightmap UV有一个很常见的坑DCC里明明展好了UV2导入引擎却看不到。原因是很多模型导出格式FBX、OBJ默认只导出第一套UV或者DCC里第二套UV没有正确命名。FBX通常支持多套UV导出但需要你在导出设置里显式勾选确认目标是UV2。我踩过几次这个坑之后现在是直接在导出前把UV2在DCC里复制为命名明确的UV通道并在引擎导入面板中手动指定Lightmap Coordinate Index完全不给引擎自动发挥的空间。交接还需要确认单位比例一致。UV密度是基于物理尺寸计算的如果在Blender里模型单位是厘米、Unity里导入单位为米展好的UV密度在引擎看来会直接翻了一百倍或缩到百分之一光照图精度会变得莫名其妙。模型交接时把单位校准这一步纳入检查流程能提前避开大量后续烘焙问题。4. 生成Lightmap UVs之后的检查与调优4.1 密度对齐通过texel density统一光影精度生成完Lightmap UV第一个要检查的就是密度。很多工具和引擎插件都提供texel density的可视化功能尤其是Unity资产商店里的UV检查工具可以直接用颜色显示每个表面的密度值。大面积墙面和远处地面如果密度特别低光照细节就会丢失整个场景看起来闷闷的。统一密度的做法不是所有物体都设同一个值而是同类、同尺度、同重要性的物体保持同一档。我通常在项目里建三档主角交互区高密度周围中密度远处背景低密度。所有模型生成Lightmap UV时按这三档分别设参数而不是一个全局设置走天下。4.2 接缝的位置选择生成Lightmap UV时接缝大多由硬边角度决定但自动拆出来的接缝未必是你想要的。检查模型时如果发现有接缝刚好落在视觉焦点上比如角色盔甲的正面中央、桌面中心需要回DCC里手动规划接缝。规划原则可以总结为三个方向藏在结构转折处、藏在视线死角、藏在材质变化处。裙摆的接缝放在褶皱最深的地方圆柱的接缝放在背向镜头的那条母线上墙壁的接缝放在踢脚线上下位置。这些工作虽然繁琐但对烘焙结果的干净程度影响非常大。4.3 岛屿朝向与UV方向Lightmap UV对方向不敏感但有一个东西它敏感UV岛的翻转。如果某个岛在拆分时被镜像了光照贴图上的方向计算就会出错烘焙结果在该区域会出现左右颠倒的影子。检查时注意在UV编辑器里打开面朝向的显示选项通常蓝色为正、红色为背把所有红色面全部翻转回来。这一点在自动生成Lightmap UV时基本不会遇到但在你手动调整过岛的位置或复制过模型部件后容易出现。尤其从对称模型复制另一半时复制体上的UV常常是镜像的不检查直接烘焙出来就是一片斑驳。4.4 烘焙前必查清单下面这份清单是我每次烘焙前必过的推荐直接抄下来贴在工位边上Lightmap UV是否存在是否指向正确的UV通道所有物体是否都有正确的光照UV有没有遗漏的静态模型硬边角度、间距Padding是否匹配当前光照图分辨率是否有UV重叠是否使用了合理的烘焙缩放偏好目标光照贴图分辨率与物体距离是否匹配接缝位置是否藏住了有没有出现在大块平滑表面上镜像翻转的UV岛已修正单位统一、贴图导入设置正确道具和地面的UV密度相对稳定不出现明显跳档这份清单看起来是小事但真实项目中因为漏了其中一项导致反复重烘焙、浪费半天时间的情况比比皆是。5. 生产环境常见问题与排查技巧实录5.1 黑影、漏光烘焙结果不自然的典型原因烘焙完成之后最常见的问题是模型表面上出现大片不自然的黑影或者墙角、门缝往外漏光。大部分情况下黑影的根源不在灯光而在UV。漏光通常分两种。一种是无缝几何体上的UV边界没有对齐烘焙器在计算像素时墙壁和地板这两片区域虽然在实际空间中相连但在UV空间里隔了很远或隔着别的岛间接遮蔽信息串不过来于是出现了不该有的漏光。另一种是Padding不够相邻UV岛之间像素互相污染光影信息串线。排查方法很简单在引擎里把Lightmap可视化选成UV Overlap或者Lightmap UVs显示直接看模型表面的UV岛分布。如果发现某个角落的岛特别小、边缘紧贴其他岛基本就能锁定问题区域。修复方式是回DCC里手动调整这两个岛的位置把这部分的Padding加大或者重新生成时提高Pack Margin参数。5.2 接缝撕裂与边缘锯齿接缝撕裂的典型表现是烘焙阴影在一条线上突然断开一边亮一边暗看起来像是模型表面被切了一刀。这个问题有两个来源。第一来源是展开方向不一致。自动生成时同一个岛附近的两个区域虽然分成两个岛但它们的法线方向在光照计算中需要平滑过渡而UV空间里它们各自朝向不同方向采样时坐标跳跃导致阴影错位。修复方法是在两个岛之间手动添加视觉过渡或者把它们合并成一个岛。第二来源是光照图分辨率不足边缘锯齿被放大了。尤其细长型模型比如栏杆、柱子它们本身的表面积很大但光照UV摊得又窄又细烘焙出来边缘全是台阶状锯齿。这种情况下把该物体在引擎里的Lightmap Resolution调高半档或一档立刻能改善。5.3 提示UV Overlap却生成成功了有时候引擎会提示检测到UV重叠但模型明明勾了Generate Lightmap UVs感觉像是个矛盾的状态。不要慌这类提示通常是引擎在提醒你模型存在多套UV并且其中一套往往是UV1里有重叠区域即使Lightmap UV是新的烘焙器在某些老旧的烘焙通道里仍可能引用到错误的一套。处理方法第一优先级是确认Lightmap Coordinate Index指向正确的UV通道确认后把旧的包含重叠的UV通道清除或导出时直接不勾选它。如果必须保留可以在材质面板里屏蔽那套UV的采样或者简单粗暴地重新展一遍。5.4 直接光照下的阴影抖动烘焙贴图在静态光照下出现阴影抖动通常会让美术头疼半天。这里有一个隐藏因素Lightmap UV的倾斜(shear)变形过了0.5像素导致烘焙光照在局部出现亚像素级别的抖动。这种情况比例不高真遇到了先去查该表面是否被拆成过长的三角形条带。DCC里的边缘环如果有一串畸形的长三角形展开后在UV space里会产生明显变形。通常做法是回DCC清理这个区域的网格布线把长条带细分或整理成更方正的四边形烘焙结果就会稳定。5.5 排查顺序与快速定位方法很多新人喜欢一个参数一个参数地乱调我的经验是按下面顺序排查比较高效一、先用引擎自带的光照UV可视化工具检查UV分布和密度这是最直观的一步。二、开一个低分辨率测试烘焙看问题是否依旧存在这一步能过滤掉大量灯光和参数干扰方便定位到UV本身。三、检查问题表面的接缝、岛朝向、Padding设置。四、确认模型变换和单位没有出问题特别是导入缩放过的情况。五、如果上面都查不到把问题物体单独复制到一个空白场景关掉所有全局光照参数用一盏平行光单独烘焙验证。这一套流程走下来绝大多数Lightmap UV相关问题都能在15分钟内定位原因。比对着各种论坛帖子猜来猜去要快得多。我个人在实际操作中的体会是Generate Lightmap UVs这个功能远没有看起来那么简单它背后是建模规范、资源分配和引擎特性三者的交叉地带。多数烘焙问题追到根上不是灯光调得不好而是这套UV从一开始就没留够余地。养成生成完就检查密度、检查重叠、检查Padding的习惯比攒一堆修复技巧更管用。最后再分享一个小技巧每次调整完UV后都烘焙一次2048分辨率的极低质量预览全程控制在半分钟以内拿这个结果去判断UV是否合理比一口气烘焙4096甚至8192再发现问题要省下几十倍的等待时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑