
1. 項目概述從靜態烘焙到動態光影的十年跨越如果你是從Unity 5.x甚至更早版本一路走來的開發者提起LightMap腦海里浮現的很可能是一段漫長而充滿不確定性的等待——點擊“烘焙”按鈕泡杯咖啡祈禱不要出現漏光、接縫或者奇怪的色塊。那個時代的全局光照GI技術更像是一門“烘焙”的藝術充滿了手工調整和運氣成分。然而當項目升級到Unity 2022 LTS你會發現光影世界已經發生了翻天覆地的變化。實時全局光照、混合光照、光照探針體積等技術的成熟讓“LightMap”這個詞的含義從一張靜態的、預計算的光照貼圖演變為一套動態的、實時的光照解決方案體系。這個演進過程并非一蹴而就它伴隨著渲染管線Built-in RP, URP, HDRP的分化、硬件性能的提升以及算法本身的革新。對于許多正在將老項目升級或在新項目中嘗試高級光照效果的團隊來說技術棧的斷層感非常明顯。在Unity 5.x中行之有效的設置在2022版中可能完全失效甚至導致性能災難。更棘手的是網絡上充斥著不同版本、不同管線的碎片化信息讓開發者很容易掉進“坑”里。本文的目的就是梳理從Unity 5.x到2022版這近十年間LightMap相關核心技術的演進脈絡并聚焦于從“靜態烘焙”到“支持實時更新”這一核心訴求提供一份基于實戰的、完整的避坑指南。無論你是想優化一個老項目還是在新項目中構建一套穩健的動態光影系統這里的內容都將為你節省大量試錯時間。2. 核心概念演進與技術選型解析2.1 Unity 5.x時代的Enlighten與烘焙哲學在Unity 5.x時期全局光照的絕對主角是Enlighten預計算實時全局光照Precomputed Realtime GI。這套系統的設計哲學非常清晰將復雜的間接光計算提前烘焙到LightMap和Light Probe中運行時通過輕量的實時計算來更新直接光照變化對間接光的影響。它的工作流分為兩步預計算和實時更新。預計算烘焙這是最耗時的一步。Enlighten會將場景的幾何結構、材質反射率等信息通過輻射度算法Radiosity預計算物體表面之間的光線反彈生成光照貼圖Lightmap和光照探針Light Probe數據。此時的Lightmap是靜態的存儲了場景的“基礎照明”信息。實時更新當場景中的實時光源如Directional Light設置為Realtime移動或改變強度時Enlighten會利用預計算好的“傳輸路徑”信息快速近似地計算出這些變化對間接光照的影響并動態更新光照探針和部分Lightmap如果啟用。這實現了“實時全局光照”的視覺效果。避坑點1對“實時”的誤解。很多開發者誤以為Enlighten Realtime GI是完全實時的。實際上它的“實時”建立在沉重的預計算基礎上。預計算時間隨場景復雜度呈指數級增長且對場景結構有嚴格要求需封閉、需UV2。一旦場景改動就需要重新預計算這在大型項目迭代中是不可承受之痛。因此在Unity 5.x后期很多項目實際上只使用其Baked GI模式即完全烘焙靜態光照放棄實時更新以換取穩定的效果和烘焙時間。2.2 Unity 2018-2020Progressive GPU Lightmapper的崛起與管線分化Unity 2018引入了基于GPU的Progressive Lightmapper漸進式光照貼圖器這是一個革命性的變化。它采用路徑追蹤Path Tracing算法能夠生成噪點逐漸減少、視覺上無偏的、電影級質量的光照貼圖。相比CPU版的EnlightenProgressive尤其是GPU模式烘焙速度有數量級的提升并且對場景的封閉性要求降低。與此同時可編程渲染管線SRP的推出帶來了URP和HDRP。這直接導致了光照系統的分化Built-in RP內置渲染管線繼續支持Enlighten和Progressive Lightmapper是舊項目兼容的基石。URP通用渲染管線在早期版本中URP對Enlighten的支持不完整主要推動使用Progressive Lightmapper進行完全烘焙Baked Lighting。其實時全局光照能力較弱更多依賴光照探針和屏幕空間技術如SSGI。HDRP高清渲染管線作為高端管線它很早就棄用了Enlighten全面轉向Progressive Lightmapper進行光照烘焙并大力推廣實時光線追蹤Ray Tracing和屏幕空間全局光照SSGI作為其實時動態全局光照方案。技術選型決策點在這個階段選擇哪種方案首先取決于你選擇的渲染管線。如果堅持Built-in RP可以延續Enlighten的工作流如果使用URP/HDRPProgressive烘焙是更現代、更高效的選擇。但需要注意的是Progressive Lightmapper在當時主要定位是烘焙器其“實時更新”能力并不如Enlighten那樣是原生設計的一部分。2.3 Unity 2021-2022實時GI的現代化方案與最佳實踐來到Unity 2022 LTS技術格局已經非常清晰。Enlighten技術已被官方標記為“Legacy”不再推薦用于新項目。現代Unity的“LightMap技術棧”應該被理解為“靜態光照烘焙” “動態全局光照”的組合。靜態光照烘焙基石Progressive LightmapperGPU已成為所有管線下高質量靜態光照烘焙的絕對標準。它快速、高質量用于處理所有靜態Static物體和靜態光源Baked Light的照明生成最終的Lightmap Atlas。這是場景光照的基底性能消耗為零運行時僅采樣貼圖。動態全局光照實時更新這才是實現“實時更新”效果的核心。根據管線不同主要有以下方案Built-in RP / URP光照探針Light Probes 反射探針Reflection Probes這是最經典、性能最好的動態物體全局光照方案。通過在被動態物體包圍的空間中布置探針網絡動態物體在移動時混合鄰近探針的數據從而獲得變化的間接光和反射。這是實現“實時更新”視覺效果的骨干技術。你需要精心布置探針密度在走廊、轉角處加密。屏幕空間全局光照SSGIURP包中提供的后處理效果。它根據屏幕深度和法線信息估算屏幕內像素的間接光反射。優點是無需預計算完全實時對動態場景友好。缺點是視野外、被遮擋的物體無法貢獻間接光且容易有屏幕空間算法的典型瑕疵如邊緣泄露。HDRP實時光線追蹤全局光照Ray Traced GI這是最高質量的實時方案通過追蹤光線模擬真實的物理反彈。效果極佳但需要高端RTX顯卡性能開銷巨大。屏幕空間全局光照SSGIHDRP中的SSGI效果更佳作為Ray Traced GI的降級或補充方案。光照探針體積Light Probe VolumesHDRP中光照探針的升級版將探針組織成3D體積網格能為大型動態物體如角色提供更精確、漸變的間接光照避免了傳統探針混合的突兀感。避坑點2混淆“烘焙”與“實時”的目標。很多開發者追求“完全實時的光影更新”這在不使用光線追蹤的情況下是不現實的。現代最佳實踐是用Progressive Lightmapper烘焙好絕大部分靜態環境的精美光照作為基底然后用光照探針/SSGI/Ray Tracing來處理動態物體和光源移動帶來的光照變化。這樣既保證了質量又平衡了性能。3. 從烘焙到實時更新的完整工作流與實操3.1 場景準備與模型規范跨版本通用無論技術如何演進良好的場景和模型規范是高質量光照的基礎。模型導入設置生成光照貼圖UVLightmap UV在模型導入設置中務必勾選“Generate Lightmap UVs”。這會讓Unity為模型自動生成第二套UVUV1用于展開Lightmap避免與主UVUV0重疊導致紋理錯誤。對于復雜模型自動生成的UV可能有過大的拉伸或重疊需要使用3D軟件手動展好第二套UV。注意Unity 2022中對于使用Progressive Lightmapper的模型有時需要檢查模型的“Scale in Lightmap”參數是否合理過大或過小都會影響烘焙質量和Atlas利用率。場景物體標記Static vs Dynamic將所有永遠不會移動、旋轉、縮放的物體如地形、建筑、大型道具標記為Static。這包括在Inspector右上角勾選“Static”下拉菜單中的“Contribute GI”和“Occluder Static”等。Static物體才能被烘焙進Lightmap。所有需要移動的物體角色、車輛、可交互道具絕對不能標記為Static。它們的光照將完全依賴于實時光源、光照探針和反射探針。光源設置與模式選擇Mixed混合模式這是實現“靜態基底動態更新”的關鍵光源類型。一個Mixed模式的Directional Light方向光常作為太陽/月亮會將其直接光照部分實時渲染同時將其間接光照部分烘焙到Lightmap中。當它移動如晝夜循環時直接光實時變化間接光通過探針也能近似更新。Realtime實時模式光源完全動態不參與烘焙每幀計算。性能開銷大常用于手電筒、車燈等小范圍特效光源。Baked烘焙模式光源效果完全烘焙到Lightmap中運行時無性能消耗。適用于靜態的室內燈泡、霓虹燈等。3.2 靜態光照烘焙配置以Progressive Lightmapper為例打開Window Rendering Lighting (Unity 2022中為Lighting Settings)。Lightmapper選擇在“Lighting Settings”中選擇Progressive GPU首選或Progressive CPU。GPU烘焙速度遠快于CPU。光照貼圖分辨率與參數Lightmap Resolution單位是“每單位紋素texels per unit”。值越高Lightmap越清晰但貼圖尺寸和烘焙時間也越長。室內細節場景可能需要30-50大型戶外場景10-20即可。可以通過物體的“Scale in Lightmap”屬性在Mesh Renderer組件中微調單個物體在Lightmap中的占比。Lightmap Padding烘焙圖集中各圖表之間的間隔防止采樣時邊緣滲色。通常2-10像素分辨率越高Padding可以相對設小。Max Lightmap Size最終生成的圖集大小。2048或4096是常見選擇。Unity會自動將多個物體的光照信息打包到一張或多張這個尺寸的圖集中。環境光設置Environment Lighting Source設置為“Color”或“Gradient”來定義場景的基礎環境光天空顏色。對于烘焙更推薦使用Skybox Material并確保該天空盒材質被分配到Lighting窗口的“Environment”欄中這樣烘焙出的環境反射才準確。Environment Reflections Source同樣設置為Skybox用于烘焙反射探針或物體的環境反射。開始烘焙點擊“Generate Lighting”按鈕。Progressive Lightmapper會以漸進方式顯示預覽你可以隨時暫停查看效果滿意后再等待其完成最終烘焙。實操心得烘焙前務必在“Lighting Settings”的“Scene”標簽頁下點擊“Baked Lightmaps”旁邊的“...”菜單選擇“Delete Baked Data”清除舊的烘焙數據避免殘留數據干擾。3.3 實現動態光照更新光照探針網絡部署這是讓動態物體融入已烘焙靜態場景的靈魂步驟。創建光照探針組GameObject Light Light Probe Group。將其放置在場景中。布置探針原則在動態物體可能活動的所有空間均勻布置。想象一個3D網格。關鍵區域加密在門口、走廊、樓梯、轉角等光照變化劇烈的區域需要增加探針密度。在開闊且光照均勻的區域可以稀疏布置。避免放置不要將探針放在物體內部、或貼墻放置。探針應該位于動態物體可以到達的“自由空間”中。使用“Selected Positions”模式在Light Probe Group組件中可以框選多個探針進行復制、對齊等操作提高布局效率。烘焙探針布置好后再次點擊“Generate Lighting”。這次烘焙不僅會更新Lightmap也會計算每個光照探針位置的顏色和強度信息。烘焙完成后動態物體MeshRenderer只要其“Use Light Probes”選項為開啟狀態默認開啟在移動時就會自動混合鄰近探針的數據從而獲得與當前位置匹配的間接光照。避坑點3探針數量與性能。探針數據是運行時加載到內存中的。一個擁有成百上千個探針的大型場景其數據量不容小覷。務必使用遮擋剔除Occlusion Culling來確保不在視野內的探針數據不被加載。同時在性能敏感的平臺如移動端需要嚴格控制探針總數。3.4 在URP/HDRP中啟用屏幕空間全局光照SSGI對于URP和HDRPSSGI提供了一個無需預布置探針的實時更新方案。URP安裝URP包如未安裝。在Project Settings Graphics中將URP Asset分配給“Scriptable Render Pipeline Settings”。在主相機或后處理體積Volume中添加“Screen Space Global Illumination”后處理覆蓋。調整參數如“Ray Step”、“Intensity”等。SSGI效果很依賴屏幕分辨率和場景深度精度可能需要仔細調校。HDRP在HDRP Asset中確保“Frame Settings” “Lighting”下的“Screen Space Global Illumination”已啟用。在場景中創建一個后處理體積Volume并將其設置為“Global”。在該Volume的Override中添加“Screen Space Global Illumination”并啟用它調整參數。注意事項SSGI是屏幕空間效果這意味著它只能處理攝像機能看到的內容。對于封閉房間內的動態物體如果光源在房間外SSGI可能無法計算出正確的間接光。此時光照探針仍然是更可靠的選擇。通常建議將SSGI作為探針網絡的視覺質量補充而非完全替代。4. 版本升級與項目遷移中的核心避坑指南將Unity 5.x項目升級到2022版光照部分是最容易出問題的環節之一。4.1 從Enlighten遷移到Progressive Lightmapper備份項目這是第一步也是最重要的一步。更改Lightmapper在Lighting Settings中將Lightmapper從“Enlighten”切換到“Progressive (GPU)”。檢查所有光源模式Enlighten時代的“Realtime”和“Baked”模式在Progressive下基本對應但“Mixed”模式的行為可能有細微差別特別是間接光的質量。需要重新審視Mixed光源的效果。重新生成光照貼圖UV對于導入的模型檢查其導入設置。有時從舊項目升級后模型的“Generate Lightmap UVs”設置可能丟失或需要重新生成以適配新的Lightmapper。選中所有關鍵模型在Model Importer中重新應用此設置。徹底清除舊數據并重新烘焙刪除Library文件夾下的“Lightmap-”開頭的緩存文件操作前請關閉Unity。在Unity中通過Lighting Settings窗口刪除所有Baked和Realtime GI數據。重新布置光照探針組舊探針數據可能不兼容。執行一次完整的Progressive烘焙。這個過程可能比Enlighten預計算快很多但首次需要等待。4.2 渲染管線遷移帶來的光照問題如果你從Built-in RP遷移到URP/HDRP問題會更復雜。材質丟失/變粉紅這是最常見問題。所有使用內置Standard Shader或舊版自定義Shader的材質都會失效。解決方案是使用Unity的材質升級工具Edit Render Pipeline Universal Render Pipeline / HD Render Pipeline Upgrade Project Materials...。但此工具并非萬能對于復雜的自定義Shader需要手動重寫或尋找URP/HDRP的等效Shader。光照強度異常URP/HDRP使用物理光照單位而Built-in RP使用任意單位。升級后所有光源的強度Intensity值可能看起來過高或過低。需要根據新的PBR標準重新調整。例如一個明亮的日光Directional Light在HDRP中強度可能在60000到100000 lux之間而在URP中可能只需要1-3。光照貼圖不顯示確保在URP/HDRP的管線資源Pipeline Asset中相關的光照設置已啟用。在URP中檢查URP Asset中的“Lighting”設置確保“Baked Global Illumination”已開啟。在HDRP中檢查HDRP Asset的“Lighting”部分。陰影問題URP/HDRP的陰影質量和距離是獨立配置的。升級后可能需要重新調整主方向光的陰影距離Shadow Distance和分辨率以及相機的遠裁剪平面。4.3 性能優化與常見問題排查Lightmap Atlas過多或尺寸過大問題運行時加載大量巨型Lightmap導致內存激增和DrawCall上升。排查在Lighting Settings的“Lightmaps”標簽頁查看生成的圖集數量和尺寸。檢查是否有大量小物體被分配了過高的“Scale in Lightmap”值。解決降低全局的“Lightmap Resolution”合理設置物體的“Scale in Lightmap”不重要的小物件可以調低至0.1-0.5嘗試使用“Lightmap Parameters”來對不同類別的物體應用不同的烘焙設置。光照接縫Seams問題在物體邊緣或Lightmap圖塊邊界出現明顯的顏色或亮度斷層。原因通常是光照貼圖UV展開不當導致相鄰表面在Lightmap Atlas上被分得太開或者Padding值太小導致邊緣采樣了鄰居的顏色。解決檢查問題模型的Lightmap UV在模型導入設置預覽適當增加“Lightmap Padding”對于復雜靜態物體考慮將其拆分為多個子物體分別烘焙有時能獲得更好的UV分布。動態物體光照閃爍或突變問題角色移動時身上的間接光突然跳變。原因光照探針布置太稀疏動態物體在兩個探針間跳躍式混合。解決在動態物體的行走路徑上加密光照探針。使用Light Probe Proxy Volume (LPPV)HDRP中為Light Probe Volume來處理大型動態物體如公交車它能提供更平滑的體積內插值避免“像素級”的探針跳躍感。烘焙時間過長排查檢查場景中是否有面數極高且標記為Static的物體檢查Lightmap Resolution是否設置過高確認使用的是Progressive GPU而非CPU。解決對遠處或細節不重要的靜態物體降低其“Scale in Lightmap”甚至取消其“Contribute GI”標記使用遮擋剔除將不可見區域排除在烘焙計算之外分層烘焙先烘焙大塊基礎光照再單獨烘焙細節區域。5. 實戰案例構建一個支持晝夜循環的動態場景讓我們通過一個具體案例串聯起上述所有知識點。目標在一個擁有靜態建筑和地形、動態角色和車輛的開放場景中實現一個平滑的、光照效果正確的晝夜循環系統。步驟1場景基礎設置導入所有靜態模型建筑、道路、山體確保它們已正確生成Lightmap UV并標記為Static。導入動態模型角色、汽車不標記為Static。創建一個Directional Light作為太陽將其模式設置為Mixed。這是實現晝夜循環的關鍵。步驟2布置靜態光照與探針網絡根據場景規模在Lighting Settings中設置合適的Lightmap Resolution例如15和Max Lightmap Size4096。在場景中均勻布置一個基礎的光照探針組Light Probe Group覆蓋所有道路和角色活動區域。在建筑入口、樹下陰影區加密探針。在室內、隧道等封閉空間內部單獨布置高密度的探針組以捕獲準確的局部間接光。點擊“Generate Lighting”使用Progressive GPU進行完整烘焙。此時靜態場景擁有了精美的光照探針也記錄了各位置的光照信息。步驟3實現晝夜循環腳本為Directional Light編寫一個簡單的旋轉腳本模擬太陽東升西落。關鍵是在旋轉過程中光源的“Mode”始終保持為Mixed。using UnityEngine; public class DayNightCycle : MonoBehaviour { public float dayDurationInSeconds 120f; // 一天游戲時間對應的真實秒數 public float startRotationX 0f; // 起始角度例如0為清晨 void Update() { // 計算當前時間比例 float timeRatio Time.time / dayDurationInSeconds; // 將時間比例映射到360度旋轉可根據需要調整旋轉軸 float currentRotation startRotationX (timeRatio * 360f); // 應用旋轉這里繞X軸旋轉模擬太陽軌跡 transform.rotation Quaternion.Euler(currentRotation, -30f, 0f); // -30f可以模擬一定的緯度傾斜 // 可選根據太陽高度角調整光強和顏色 Light sunLight GetComponentLight(); float angle currentRotation % 360; if (angle 180) angle 360 - angle; // 處理過頂后的角度 // 簡單示例太陽在地平線以下時強度為0在頭頂時最強 float intensityFactor Mathf.Clamp01(angle / 90f); sunLight.intensity Mathf.Lerp(0f, 1.2f, intensityFactor); // 根據管線調整基準強度 // 調整顏色黃昏/黎明偏紅黃正午偏白 if (angle 20f) { sunLight.color Color.Lerp(Color.red, Color.white, angle / 20f); } else { sunLight.color Color.white; } } }步驟4驗證動態光照更新運行游戲。觀察靜態場景建筑、地面的光照。由于太陽是Mixed光其直接光照部分會實時變化陰影方向、亮度而間接光照部分建筑背光面的亮度已經被烘焙到Lightmap中不會實時變化。這是正確的因為建筑是Static的。控制動態角色在場景中移動。你會發現角色身上的光照特別是陰影下的部分會隨著位置和太陽角度的變化而平滑變化。這是因為角色在實時采樣并混合周圍光照探針的數據而探針捕獲的正是Mixed光源實時變化的直接光對周圍環境的“第一次反彈”影響雖然探針數據是烘焙時預計算的傳輸路徑但混合權重在實時更新。同時太陽的直接光也實時照射在角色身上。如果角色進入一個布置了室內探針的房間即使太陽在室外角色也能獲得室內正確的間接光照。步驟5增強效果與優化反射更新創建數個反射探針Reflection Probe設置為“Baked”或“Custom”并在晝夜變化的關鍵角度如正午、黃昏手動烘焙或者使用腳本在運行時動態混合以更新場景中的反射效果如窗戶、水面。啟用SSGIURP/HDRP在URP或HDRP中為相機添加Screen Space Global Illumination效果。這將為動態物體和靜態物體的屏幕像素增加額外的、實時的間接光反射細節讓陰影內部的色彩更加豐富、真實尤其是對于快速變化的直接光如移動的太陽產生的次級反彈。性能監控在Profiler中監控“Rendering”和“Memory”模塊。觀察Draw Calls是否因Lightmap過多而上升以及光照探針數據的內存占用。根據性能瓶頸調整Lightmap分辨率、探針數量或SSGI的采樣數。通過這個案例你可以清晰地看到現代Unity光照系統的分工協作Progressive Lightmapper負責高質量的靜態基底Mixed光源和光照探針網絡負責驅動動態物體光照的實時更新SSGI等屏幕空間技術負責補充高質量的視覺細節。這套組合拳正是從Unity 5.x到2022版LightMap技術演進所指向的、兼顧質量與性能的現代化解決方案。