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