)
引子一位画家的时间难题让我先给你讲一个关于两位画家的故事。有一座辉煌的教堂阳光透过彩色玻璃窗洒进来在斑驳的石柱上投下斑斓的光影光线在拱顶间反复弹跳、彼此辉映营造出一种神圣而温暖的氛围。有两位画家都想把这幅美景呈现给观众。第一位画家是个写实狂魔。他坚持绝对的真实——他不预先画好任何东西而是让观众每看一眼他就当场、实时地把整幅画面重新计算、重新绘制一遍这束光从哪来、照到石柱哪个面、反弹后又照亮了哪里、在地面投下多深的影……每一个光子的旅程他都当场推演。画面无比真实、无比灵动——你走动时光影会随之精妙地变化。但代价是他画得精疲力竭、大汗淋漓,因为每一帧、每一秒他都要把这浩瀚的光照计算从头再来一遍。观众多看一会儿他就快累瘫了。第二位画家是个聪明的偷懒者。他想“这教堂的阳光、这石柱、这拱顶它们都是固定不动的呀光影的样子其实永远不会变。那我何必每一帧都重算呢” 于是他在开门迎客之前花了整整一夜的时间,把这幅复杂的光影一笔一笔、精雕细琢地、完完整整地画在了一张画布上。等观众来了他只需要把这张早就画好的画,轻轻一挂——观众看到的是同样辉煌、甚至更加精美的光影,而他自己却气定神闲、毫不费力因为所有的计算,他早在开门前的那一夜就一次性做完了。这两位画家就是实时光照与烘焙光照的绝妙隐喻。第一位写实狂魔,是实时光照Real-time Lighting——每一帧都当场计算真实灵动但极其耗费性能。第二位聪明的偷懒者,就是我们今天的主角——烘焙光照Lightmap / Baked Lighting提前把固定的光影画好、存起来运行时直接拿来用用极小的代价换取精美的效果。这份用时间换空间、用预计算换实时性能的智慧正是烘焙光照的精髓。今天我们就来彻底讲透这门时间的魔法。一、什么是烘焙光照——把光画进贴图里我们先给它一个清晰的定义。烘焙光照Lightmap Baking是指在游戏运行之前编辑阶段预先计算好场景中静态物体所接受的复杂光照效果包括光的直接照射、阴影、以及光线弹跳产生的间接光并把这些计算结果“画进一张专门的贴图里保存起来。这张贴图就叫做光照贴图Lightmap”。运行时引擎不再实时计算这些光照而是直接读取这张预先烘焙好的贴图贴到物体表面。这个定义里藏着几个关键词我们逐一拆解关键词一“运行之前”。这是烘焙的核心——它是一个预处理过程。就像那位聪明的画家在开门前的那一夜作画烘焙发生在你点击Bake烘焙按钮之后、游戏发布之前。这个过程可能很慢复杂场景要算几分钟甚至几小时但没关系——因为它只需要算这一次。关键词二“静态物体”。烘焙的对象必须是不会移动的物体——地面、墙壁、建筑、山石、固定的家具……因为它们不动光影就固定不变才值得被画死下来。会动的物体角色、车辆、可推动的箱子是不能烘焙的它们的光影得靠实时计算后面会讲。关键词三“画进贴图”。这是最精妙的一步。所有那些复杂的光照计算结果——哪里亮、哪里暗、阴影落在何处、间接光染上了什么色——最终都被渲染成一张图片Lightmap像一层光影的皮肤覆盖在物体表面。绝妙的比喻烘焙光照就像给一间屋子拍一张光影写真然后把这张写真当壁纸贴回去。屋子里的光影阳光、阴影、反光是固定的。与其让摄影师引擎每一秒都重新架设灯光、重新拍一次实时计算不如在最好的条件下、不计时间成本地精心拍一张最完美的光影写真烘焙。然后把这张写真当作壁纸严丝合缝地贴回屋子的每一面墙上贴图映射。从此无论谁来看看到的都是那张完美的光影——而摄影师早就收工回家了。二、为什么需要烘焙——实时光照的甜蜜负担要真正理解烘焙的价值我们得先明白实时光照到底贵在哪里我们之前反复讲过光照是画面真实感的灵魂。但要实时地、正确地计算光照是一件极其昂贵的事。尤其是其中最珍贵、也最昂贵的部分——间接光照全局光照GI。直接光 vs 间接光直接光照Direct Light光源直接照到物体上的光。比如太阳直接照亮的墙面。这部分相对好算。间接光照Indirect Light / GI光线打到一个物体后会反弹、再照亮其他物体。比如阳光照到红色的地毯上反弹起来的光会把旁边的白墙微微染红——这就是间接光也叫漫反射全局光照“color bleeding 溢色”。间接光是营造真实感、氛围感的灵魂。一个只有直接光、没有间接光的场景会显得生硬、死板、阴影处漆黑一片因为没有反弹光照亮阴影而有了间接光光线在空间里反复弹跳、彼此辉映画面才会变得柔和、通透、温暖、真实。但间接光的计算是天文数字级的昂贵因为要追踪光线的无数次弹跳——A照亮BB反弹照亮CC又反弹……这种计算量之大让实时计算全局光照在很长时间里都是不可能的任务近年的实时光线追踪才有所突破但依然昂贵尤其对移动端和低端设备。烘焙把昂贵的计算预付掉这时烘焙的价值就凸显出来了既然场景里的静态物体和光源都不动那么它们之间复杂的间接光弹跳、柔和的阴影其结果都是固定不变的。何必在游戏运行时玩家的电脑上、有限的每一帧16毫秒里去承担这份天价计算呢不如把它’预付’掉——在开发阶段用一台强力的机器花再多时间也不心疼地把这份昂贵的全局光照精算出来存进 Lightmap。于是运行时的效果是玩家看到了媲美电影级的、包含丰富间接光的、精美柔和的光照效果;而运行时的性能开销却低到几乎可以忽略——因为引擎只是读一张贴图而已那些天价计算早在开发时就付清了这就是烘焙的核心价值——用’开发时的时间’和’一点内存存贴图‘,换取’运行时媲美高端效果的画面’和’极低的实时开销’。对于性能吃紧的移动游戏、需要跑在各种设备上的项目烘焙光照简直是救命稻草。一句话总结价值烘焙是一场划算至极的预付款交易——把最昂贵的光照计算从’运行时的每一帧’挪到了’开发时的那一次’。一次辛苦永久受益。三、烘焙光照 vs 实时光照一场经典的权衡理解了原理我们来系统地对比这两种光照方式。这份对比是每个 Unity 开发者都必须烂熟于心的权衡艺术。维度实时光照Real-time烘焙光照Baked / Lightmap计算时机运行时每一帧当场算开发时预先算好存起来运行性能消耗大尤其GI消耗极小只读贴图画面效果灵动可实时变化精美但固定不变能否移动光源、物体都可动光源和物体必须静止间接光(GI)昂贵难以实时全算可尽情烘焙效果极佳内存占用几乎不额外占占用内存存Lightmap贴图灵活性高可动态变化低烘焙后即固定从这张表我们能读出两者最核心的取舍实时光照换来了灵活与灵动光可以变、物体可以动代价是昂贵的运行开销。烘焙光照换来了极致的性能与精美的效果代价是僵化一切都被画死,不能动。这是一个经典的、没有绝对优劣的权衡。关键在于——根据物体的特性选择合适的方式。四、实战智慧混合光照——两全其美的艺术聪明的你可能已经想到了一个真实的游戏场景里既有不动的东西地面、墙也有会动的东西角色、敌人。那到底用哪种光照呢答案是——都用这就是混合光照Mixed Lighting的智慧。现代游戏的主流做法是能烘焙的就烘焙该实时的才实时,让两者各司其职、协同工作静态的场景地面、建筑、山石、固定装饰→烘焙。它们不动光影固定烘焙进 Lightmap享受精美效果 极低开销。动态的物体角色、怪物、可移动道具→实时光照。它们会动光影必须实时算。但这里有个关键问题会动的角色走进了烘焙好的场景里怎么让它融入这个环境怎么让它也接受到场景里那些美丽的间接光比如走过红地毯时被染上一点红光如果角色只有实时的直接光它会显得和精美的烘焙环境格格不入,像是硬贴上去的。这就要引出烘焙体系里另一个精妙的搭档——光照探针Light Probe。光照探针Light Probe让动态物体融入烘焙环境光照探针是散布在场景空间中的一个个光照采样点。它们在烘焙时记录下’空间中各个位置的光照信息’包括来自四面八方的间接光。当动态物体如角色经过某个位置时就从附近的探针那里’询问’‘我这个位置应该受到怎样的环境光照’——从而让动态物体也能享受到烘焙好的、精美的间接光自然地融入环境。打个比方烘焙 Lightmap是给墙壁地面这些静态表面拍了光影写真。而光照探针则是在空间中布下了一张光照信息的网——记录的不是某个表面的光影而是空间中每个点弥漫着怎样的环境光。于是当角色走过红地毯上方时附近的探针告诉它“你这儿有从红地毯反弹上来的红光哦”——角色便会被自然地染上一层暖红与环境水乳交融再也不显突兀。混合光照的完整图景静态场景表面→Lightmap表面的光影写真;动态物体→实时光照 Light Probe实时算直接光用探针取环境间接光;两者无缝配合达成性能极佳 效果精美 动静皆宜的理想境界。这就是现代游戏光照的两全其美之道——不是非此即彼而是取二者之长各安其位。五、烘焙背后的关键Lightmap UV讲到这里必须揭示一个技术上极其重要、新手却常常忽略的环节——Lightmap UV光照贴图 UV。我们之前讲 UV 时说过UV 是贴图与模型对位的图纸。烘焙好的光影要作为一张贴图贴回物体表面同样需要 UV 来对位。但这里有个关键点烘焙用的 UV往往和普通贴图基础色等用的 UV是两套独立的 UV为什么因为普通贴图的 UVUV0允许重叠、平铺比如一面墙用一小块砖贴图反复平铺UV 是重叠复用的以节省贴图。Lightmap 的 UVUV1绝对不能重叠因为每一处表面接受的光照是独一无二的这块墙角暗、那块墙面亮如果 UV 重叠了两处不同的光影就会抢同一块贴图区域导致光照错乱、漏光、脏影。所以 Lightmap UV 必须让模型的每一个面都在贴图上占据独立、不重叠的一块区域。实践叮嘱在 Unity 里对于要烘焙的模型需要确保它有一套合理的 Lightmap UV。你可以在模型导入设置里勾选Generate Lightmap UVs自动生成光照UV,让 Unity 帮你自动展一套不重叠的 UV。对于要求精细的场景专业美术会在建模软件里手动、精心地展好这套 UV。如果 Lightmap UV 有问题重叠、接缝不当烘焙出来的光影就会出现漏光、黑斑、脏影等诡异瑕疵——这是烘焙翻车的常见原因之一务必留意。六、动手实践Unity 中的烘焙流程与要点理论讲透我们来梳理一下 Unity 中烘焙光照的核心步骤与要点。第一步标记静态物体。把场景中不动的物体在 Inspector 右上角勾选为Static静态更精确地说是勾选Contribute GI相关选项。只有被标记为静态的物体才会参与烘焙。这一步是烘焙的前提——你得先告诉引擎哪些东西是不动的、可以烘焙的。第二步设置光源模式。把要烘焙的光源如方向光/太阳的 Mode 设为Baked烘焙或Mixed混合。Baked完全烘焙光源不能再变化性能最优。Mixed混合模式光源的直接光可实时比如可以有实时阴影投射到动态物体上间接光则烘焙。兼顾了一定的灵活性与性能是常用选择。第三步配置 Lightmap 参数。在 Lighting 窗口里设置 Lightmap 的分辨率越高越精细但越占内存和烘焙时间、间接光强度、采样数等参数。这是效果与开销权衡的调节区。第四步确保 Lightmap UV 正确。如前所述确保静态模型有合理的、不重叠的 Lightmap UV。第五步点击 Bake烘焙。然后……等待。引擎开始那场开门前的作画——复杂场景可能要等几分钟到几小时。这期间它在疯狂计算光线的弹跳与阴影。第六步检查结果反复调优。烘焙完成后检查效果有没有漏光阴影是否自然间接光是否到位有没有黑斑脏影然后针对性地调整参数、UV、光源重新烘焙——烘焙往往是一个烘焙→检查→调整→再烘焙的反复迭代过程。一个重要的心理准备烘焙需要耐心。它不像实时光照那样所见即所得、改了立刻看到。你改一个参数可能就要重新等待漫长的烘焙。所以规划好、想清楚再烘焙能省下大量时间。这也是预付款模式的一点代价——你把运行时的轻松换成了开发时的等待与打磨。七、烘焙的局限与适用场景烘焙虽好但绝非万能。清醒地认识它的局限才能用好它。局限一一切静态不能变化。烘焙的光影是画死的。你不能在运行时改变太阳的角度做个日夜循环、不能让烘焙的灯熄灭、不能移动烘焙过的物体一移动它身上的光影就和新位置对不上了穿帮。需要动态变化光照的场景如昼夜系统、可破坏场景烘焙就力不从心。局限二占用内存。Lightmap 是实实在在的贴图要占内存和包体。场景越大、精度越高Lightmap 越大。移动端尤其要控制 Lightmap 的分辨率和数量。局限三需要展 UV、耗费烘焙时间。前期的 UV 准备和漫长的烘焙等待是开发流程上的成本。那么烘焙最适合什么场景光照固定不变的静态场景室内建筑、固定的关卡、展厅、建筑可视化——这些光影不变的地方烘焙是绝配。性能吃紧的平台移动游戏、VRVR 对帧率要求极高实时GI几乎不可行、需兼容低端设备的项目——烘焙是保证画面又保证性能的关键手段。追求电影级静态画面质量想要极致精美的间接光、柔和阴影又不需要动态变化时——尽情烘焙。尾声预见性的智慧——把辛苦留给过去我们从两位画家的故事出发一路讲透了烘焙光照它是聪明的偷懒者——提前把固定的光影算好、存进 Lightmap运行时直接读取;它的核心价值是把昂贵的实时光照计算尤其间接光,预付到开发阶段,换取运行时的极致性能与精美效果;它与实时光照是一场经典的权衡——烘焙换性能与精美实时换灵活与灵动;现代游戏用混合光照 光照探针,让静态与动态各司其职、两全其美;我们也认识了背后的Lightmap UV、烘焙流程以及它的局限与适用场景。回过头来品味烘焙光照这门时间的魔法,蕴含着一种极为深刻、也极为实用的智慧——“预见性的智慧”,或者说把辛苦留给过去把从容留给未来的智慧。那位聪明的画家之所以能在开门迎客时气定神闲不是因为他偷懒、不是因为他能力比写实狂魔差——恰恰相反是因为他看得更远。他预见到光影是固定的、重复计算是浪费的,于是他主动地、在无人催促的从容时刻开门前的那一夜把最艰苦的工作一次性地、高质量地完成了。于是当那个真正需要即时响应的时刻观众到来降临时他早已胸有成竹、举重若轻。这何尝不是一种顶级的处世与工作智慧我们生活、工作中也充满了实时计算式的手忙脚乱——事到临头才准备每次都从头折腾疲于奔命。而真正的高手懂得烘焙的智慧——识别出那些固定不变、可以预先准备的部分在从容的时候提前做足功课、把结果沉淀下来。于是当关键时刻那紧张的运行时到来他们只需从容地读取早已备好的成果举重若轻游刃有余。把复杂的思考留在从容时把轻松的执行留给紧张处。预先的辛苦成就了临场的从容。这正是烘焙光照超越技术、给予我们的人生启示。所以当你下次走进一个游戏里那光影斑驳、温暖动人的教堂或密林惊叹于那柔和通透、仿佛会呼吸的光线时——愿你能会心一笑想起那位开门前作画一夜的聪明画家。你所看到的这份从容而精美的光影正是无数个开发时的漫长夜晚、那一次次辛勤烘焙的结晶。它把辛苦封存在了过去只为在你到来的此刻绽放出最从容、最动人的光。而学会驾驭它你便掌握了那门迷人的技艺——不是更用力地去应对当下而是更智慧地去预见并成全未来。