Unity移動平臺下的烘焙使用及優化

這是侑虎科技第436篇文章,感謝作者文雅供稿。歡迎轉發分享,未經作者授權請勿轉載。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。(QQ羣465082844)

作者也是U Sparkle活動參與者,UWA歡迎更多開發朋友加入U Sparkle開發者計劃,這個舞臺有你更精彩!


前言

移動平臺下場景製作的規模越來越大,開放視角的3D大世界場景,對地圖大小、可視距離的要求越來越高,隨之帶來了地形尺寸變大、場景物件種類變多、物件的模型面數和數量增長,對美術效果上的要求也趨近於主機和PC端遊戲。

Realtime Global Illumination 在移動平臺下還不能隨意使用,美術場景的光照主要還是以 Baked GI 爲主,隨着Unity版本的升級,場景烘焙流程也迭代過幾個版本,但是仍然暴露出了越來越多的問題。在Unity官方的技術支持下我們發現在烘焙流程中疏忽了一些很重要的環節,加上升級Unity 2017.4後更換了烘焙模式,因此而整理此文。

一、Unity光照烘焙系統

以Unity 5.6版本前後這個時間節點介紹一下光照烘焙系統,舊的歷史版本就不做回顧了。

請輸入圖片描述


1.1 基於Enlighten的GI和Lightmapping Workflow

 

Unity 5.0版本升級了基於Enlighten的real-time GI,以及升級了烘焙光照圖的工作流程。“Auto”模式下會生成預計算的實時GI、靜態光照圖Lightmaps、燈光探針Light Probes、反射探針Reflection Probes等數據。主要升級內容:

1)實時GI支持的Lights及Skylight的修改,支持自發光的表面作爲實時光源,發光的顏色可以實時影響動態物體,並可以動態修改。

2)光照圖Lightmap有三種模式:

  • "Non-directional" 模式開銷最小,得到一個普通的漫反射效果。
  • "Directional" 模式會計算法線,所以Lightmap帶有漫反射和法線的效果。
  • "Directional Specular" 模式還會保留高光效果。

    請輸入圖片描述

3)Reflection Probes支持HDR格式,且支持實時渲染或者烘焙存儲爲Cube資源。

請輸入圖片描述

 

4)Skybox支持HDR格式,Skybox可以作爲環境光的一種。

請輸入圖片描述

 

從Unity 5.0開始,烘焙系統就不僅僅依賴燈光來營造烘焙效果了,在烘焙流程中還應該考慮環境光、反射環境、使用發光Shader的材質等。

1.2 Mixed Lighting

Unity 5.6版本開始Baked GI變更爲混合光照Mixed Lighting,Light Mode設置爲Mixed不僅是指燈光對靜態物件和動態物件共同作用,而是真正的去混合間接光照與直接光照、烘焙陰影與實時陰影。

基於Mixed Lighting增加了新的Shadowmask烘焙方式,支持烘焙陰影與實時陰影進行融合。建議使用Unity 2017以上版本,在Unity 2017.1版本中,Shadowmask和Distance Shadowmask兩種模式的切換移到了QualitySetting中,通過QualitySettings.shadowmaskMode進行修改。

請輸入圖片描述


畫面左側Shadowmask模式下是完全烘焙的Shadowmap效果,畫面右側Distance Shadowmask是實時陰影與烘焙Shadowmap按照設置距離融合的效果。

1.3 Progressive Lightmapper

Unity 5.6版本增加了新的特性Progressive Lightmapper,一種與Enlighten完全不同的一種漸進光照貼圖技術,隨之改進了烘焙工作流程。

Progressive Lightmapper基於路徑追蹤漸進的生成光照圖,可以快速預覽場景的烘焙光照,快速烘焙出lightmaps和Light Probes,然後逐漸迭代顯示爲最終版本。

請輸入圖片描述

 

基於Enlighten的烘焙依賴Precomputed realtime GI來生成間接光照,它的優勢是,只修改燈光的情況下可以快速生成新的光照貼圖,但是在地圖的製作階段會由各種因素涉及到場景物件的改動,Lightmap UVs佈局會重新發生變化。在Enlighten特性下,還是需要頻繁的進行烘焙生成光照圖,而在Progressive Lightmapper這種特性下,"Auto Generate"才能真正變得可用於大型場景的製作。

Enlighten無法完全避免因爲UV引起的效果上的缺陷,而Progressive Lightmapper對UV的要求比較正常:沒有重疊的UV、較小的面積和角度的誤差、Charts之間有足夠的填充間距。隨着Unity的版本升級,Progressive Lightmapper能提供更好的解決方案和烘焙效果,比如在Unity 2017.2版本中增加的Stitch Seams功能可以修復接縫處的光照。

請輸入圖片描述

 

而Progressive Lightmapper在Unity 2017所有的版本中還只支持預覽,在Unity 2018中才支持烘焙使用。如果沒有升級到Unity 2018,還是需要繼續使用Enlighten的烘焙系統。不過,隨着Progressive Lightmapper的出現,Unity的烘焙流程也在往更好的方向調整。

Unity 5.6版本開始,UV Control和Lightmap Settings從Lighting-Object面板移到了Inspector面板的物件屬性中,由Mesh Renderer統一管理,我們在Mesh導入階段就應該注意和重視光照相關的2號UV設置以及Lightmap設置

請輸入圖片描述

 

二、Mixed Lighting烘焙模式

2.1 Mixed Lighting的三種模式

在 Window > Lighting > Scene 面板中對 Mixed Lighting 中的 Lighting Mode 進行選擇。Mixed Lighting有三種模式:

請輸入圖片描述
圖左:只烘焙間接光照;圖中:烘焙間接光照和陰影;圖右:烘焙直接光照、間接光照和陰影

 

使用混合光照可以理解爲間接光照、直接光照、陰影之間進行混合。三種模式下得到的烘焙光照圖不一樣,混合燈光的計算也不一樣。

請輸入圖片描述

 

Baked Indirect 與Shadowmask模式下,混合燈光的直接光照是實時計算的,間接光照被烘焙在光照圖中。Shadowmask模式下會多一張陰影光照圖,會有額外的內存開銷,當Shadowmask的類型爲Distance Shadowmask時,陰影光照圖可以與實時陰影按照Shadow Distance設置的距離進行混合。Baked Indirect模式下的靜態物體只可能有實時陰影,按照Shadow Distance設置的距離過渡到無陰影。

Subtractive模式類似於舊版本的Baked GI,它的直接光照也被烘焙在光照圖中,作爲Mixed Lighting的一種備用解決方案,用於低端手機設備。Subtractive模式下,參與實時計算的只有動態物體的實時光照和動態物體對靜態物體的投影。

2.2 Shadowmask烘焙模式

1)Mixed燈光的作用
Mixed燈光對靜態物體產生的間接光照記錄在光照圖Lightmap_light上,對靜態物體產生的陰影記錄在光照圖Lightmap_shadowmask上。Mixed燈光產生實時的Direct Lighting與Lightmap_light上的Indirect Lighting一起計算靜態物件的光照;Mixed燈光產生的實時陰影與光照圖Lightmap_shadowmask上的陰影信息一起計算靜態物件的陰影;對動態物件計算實時陰影。

烘焙好的光照信息存儲在兩組光照圖上,不能在運行時修改,但是Mixed燈光的參數(比如Directional Light的參數Transform、Color、Intensity)可以在運行時修改。

2)Shadowmask的兩種模式
在 Edit > Project Settings > Quality > Shadows的設置中,可以設置Shadowmask Mode和Shadow Distance的參數

請輸入圖片描述

 

Shadowmask Mode爲Shadowmask時,使用Lightmap_shadowmask上的烘焙陰影。

Shadowmask Mode爲Distance Shadowmask時,根據設置的Shadow Distance參數值對實時陰影和烘焙陰影進行融合。在距離以內使用Realtime Shadowmap,分辨率爲Shadow Resolution所設置的陰影分辨率;在設置的距離外使用Lightmap_shadowmask上的烘焙陰影。

Distance Shadowmask的開銷更高,因爲靜態物件也在Shadowmap中實時渲染了。對於一個太陽位置固定的大世界場景,推薦使用Distance Shadowmask模式,陰影的效果可以一直延伸到地平線。

2.3 Shadowmask烘焙示例

1)舊的烘焙模式下實現實時陰影與烘焙陰影切換
Shadowmask這種烘焙模式出現之前,我們使用Unity 5.5版本實現實時陰影和烘焙陰影的切換方案是這樣的:

請輸入圖片描述
畫面左側爲烘焙光照;畫面右側爲烘焙AO與實時光照混合

 

烘焙光照:使用一組烘焙燈光組 Bake_lights_Group 按照Baked GI的流程烘焙得到光照圖,烘焙燈光組中包含一盞產生陰影的燈光。實時光Sunlight的強度只有0.1,用於繪製靜態場景接收的動態角色陰影,角色的光照也由Sunlight決定,因此在角色Shader中需要補償10倍Sunlight的強度。

烘焙AO:使用另一組烘焙燈光組 BakeAO_lights_Group 烘焙得到帶有AO信息的光照圖,燈光組中沒有產生陰影的燈光,只烘焙出燈光的顏色、AO。Sunlight作爲實時光開啓陰影,另外增加了一個全局顏色來與烘焙光照的效果校正。

這種做法的目的只是爲了將烘焙的光照圖中的陰影獨立出來,卻涉及到需要烘焙兩套光照圖、修改實時光與烘焙光照圖的混合計算、修正實時燈光的強弱和兩種效果之間的光照差異等製作流程相關的改動。

2)Shadowmask模式的優勢
Unity 5.6版本提供的Shadowmask烘焙模式,只需要烘焙一套光照圖就能滿足實時陰影與烘焙陰影切換的需求,切換Distance Shadowmask和Shadowmask就可以實現實時陰影與烘焙陰影的切換。

請輸入圖片描述
畫面左側爲ShadowMask模式;畫面右側爲Distance ShadowMask模式

 

Distance Shadowmask模式下設置Shadow Distance,可控制場景實時陰影的範圍,比使用全場景實時陰影的開銷更低。

請輸入圖片描述

 

畫面左側爲Distance ShadowMask模式下Shadow Distance爲35的效果,畫面右側爲Distance ShadowMask模式下Shadow Distance爲70的效果。

2.4 實時陰影優化策略

理解Shadowmask這種烘焙模式後, 同時需要對Edit > Project Settings > Quality > Shadows的陰影設置有更深的理解,才能利用這些參數更好的控制實時陰影的開銷。

1)合理設置Shadow Resolution
根據實際情況合理設置Shadow Resolution的值
。設置的陰影分辨率值越大,shadowmap帶寬佔用越大;陰影精度提升後,計算的開銷也會變大,對性能和發熱都有很大的影響。

通常情況下建議設置爲Medium Resolution或High Resolutin,陰影分辨率分別爲20482048和40964096。Very High Resolutin會使用硬件提供的最大分辨率,開銷太大不建議在移動平臺使用。

2)合理設置Shadow Distance
根據實際情況合理設置Shadow Distance的值
。當實時陰影距離變大時,場景中參與陰影繪製的靜態物件變多,會引起DrawCall增長,同屏繪製的三角面增多。同時,實時陰影距離越大並不代表陰影效果越好,在Shadow Resolution陰影分辨率不變的情況下,設置的Shadow Distance越大,陰影顯示質量反而降低。

3)注意Shadow Cascades的使用
使用Shadow Cascades可以讓陰影的分辨率按照距離分佈更加合理,但是有額外的陰影計算開銷
。按照Shadow Cascades的設置可以將陰影的渲染劃分成對應的幾塊區域,提升近處陰影的分辨率佔用,減輕近處陰影的鋸齒感。

如果追求更高的陰影效果可以使用Shadow Cascades,注意需要同時開啓QualitySetting和GraphicSetting中的設置纔會生效。一般不建議在移動平臺使用Shadow Cascades。

請輸入圖片描述

 

4)Shadow Projection使用Stable Fit
在整體陰影分辨率不變的情況下,使用Shadow Projection的Close Fit可以進一步的提高近處物件的陰影分辨率,同時也有更高的開銷。移動平臺建議使用Stable Fit,陰影效果更穩定。

5)制定不同畫質等級下不同的陰影配置
根據實際情況,提供不同的陰影配置給不同的畫質。

請輸入圖片描述

 

三、烘焙效率和效果的優化

隨着場景製作的規模變大,帶來對烘焙工作流程的主要影響:

1)烘焙工作量增加;
2)單個地圖的烘焙時間越來越長,還可能出現烘焙卡在進度條;
3)光照圖分辨率精度不變的情況下,光照圖數量變多,內存佔用過高。

這三個問題都與Generate Lighting的流程相關,所以我們需要理解Unity在生成光照數據時的計算過程。

3.1 Generate Lighting Process

Generate Lighting時,編輯器右下角會顯示Precompute Process在後臺的處理進度。

請輸入圖片描述

 

官網介紹的計算光照的流程:

請輸入圖片描述

 

在單場景烘焙時,耗時較高的是映射光照信息(5/11)和光照計算(7/11),所以影響烘焙速度的主要在於UV的合理性和光照的計算精度。

Unity官方提供了優化Precomputed Realtime GI的資源和詳細教程,建議閱讀原文。

請輸入圖片描述

 

這份教程劃出了優化烘焙速度的重點。
Over the course of the document we will cover:

  • How to determine an appropriate lighting resolution for our Scenes.
  • What Charts are and how they affect our precompute times.
  • How to start the precompute process.
  • Using probe lighting to reduce the complexity of our lighting
    solution.
  • Improving auto-unwrapped UVs generated by Unity’s Precomputed
    Realtime GI.
  • What Clusters are and how they are used to generate globally
    illuminated lighting.
  • Using Lightmap Parameters to fine-tune our lighting on a per-object
    basis.

3.2 UV Charts、Lightmap UVs和Clusters的理解

在計算靜態物體的光照時,Precomputed Realtime GI會先計算一部分光照數據存儲在Lighting Data Asset中,這些數據在運行時生成一組低分辨率的光照圖;Baked GI會將光照數據離線生成光照圖。實時的Lightmap與烘焙Lightmap沒有直接對應關係,兩個物件可以在同一張realtime Lightmap上,同時在兩張不同的Baked Lightmap上,Baked UVs與Precomputed realtime UVs是不一樣的。從預覽窗口可以看到UV Charting和Lightmap。

請輸入圖片描述

 

1)理解UV Charts
UV Chart是靜態物件在光照圖上的UV對應在光照圖上的區域,在預計算實時GI時,每個Chart上的像素都會計算燈光,預計算的時間跟Chart的數量有很大關係,所以瞭解Charts是怎樣工作的可以幫助我們優化光照的計算時間。

每個物件的UV Charts是由一組UV Chart組成,每個UV Chart爲一段連續的UV片段,UV Chain之間預留了0.5個像素的邊緣來防止紋理的溢出,最小的單位是44,每個Chart最少會佔用16個像素。舉例來說,一個11米大小的物體,Lightmap Resolution分辨率設置爲1時,一個Chart在光照圖上佔用16個像素,如果它有50個Charts,那麼在光照圖上佔用的像素是800。

請輸入圖片描述
左圖爲6個UV Charts,至少佔用96個像素;右圖優化爲1個UV Chart

 

2)UV Charting Control
靜態物件的光照圖參數中可以調整UV Chart的參數。Unity的UV映射方式是正交的,Unwrapping算法主要通過找到UV片段共享的邊與鄰近的邊進行縫合來簡化Lightmap UVs。

請輸入圖片描述

 

可以通過修改Max Distance(默認值0.5)和Max Angle(默認值 89)參數減少UV Chart的數量。

請輸入圖片描述

 

Max Distance代表在設置的距離內連接連接和縫合UV shell,UV的邊緣如果在設置的Max Distance距離以內會被考慮縫合。Unity系統的默認值爲0.5個單位(單位是Unity的系統單位,比如1米),比較大的物件可以將參數值設置大一些。數值越大,UV片段將會減少,但是也要根據實際情況考慮,對於一些需要在光照圖上佔用更多的像素的物件,需要更多的UV片段。

請輸入圖片描述

 

Max Angle代表在設置的角度範圍內連接連接和縫合UV shell,UV邊緣縫合與鄰近面之間的角度也有關係,共享同一個邊的兩個面之間的角度在設置的Max Angle角度以內會被考慮縫合。數值越大,UV片段將會減少,但是有些情況下太大的數值會引起UV拉伸,也需要合理的設置。

如果導入的mesh因爲過高的三角形面數被拆分爲子Mesh,在拆分處的三角面會有不同角度的法線,Charts的分佈也會受到影響。勾選Ignore Normals時(只有Precomputed Realtime GI會受這個選項的影響),Charts不會被拆分,大多數情況下拆分mesh是不需要拆分Charts的,需要注意勾選Ignore Normals選項。

通過Window > Lighting的Object選項卡,選擇Charting預覽項,可以看到選擇的物體的Chart分佈情況。

通過Scene視窗中的UV Charts可視化預覽模式,我們很容易的看出單個物體的UV Charts數量,評估使用是否合理,找到一個平衡點。

請輸入圖片描述

 

對於一些UV Charts無法合併的情況,比如樹葉的葉片、灌木小植物等,這些物件可以使用Light Probe。

請輸入圖片描述

 

3)理解Clusters
爲了簡化計算,Unity先將靜態場景體素化爲Clusters,在場景中通過格子映射到靜態幾何體的表面,用於光照計算。Clusters與UV Charts的光照映射方式類似,但是它們是獨立的功能。

通過Scene視窗中的Clustering可視化預覽模式,可以看出Cluster的分佈情況:

請輸入圖片描述
上圖中方形的一個色塊就是一個Cluster

 

4)Generate Lightmap UV
大部分的物件我們使用Unity的Generate Lightmap UVs的默認參數計算生成光照圖的UV,Hard Angle參數值可以根據物體的角度做手動調整,防止過多的UV斷開的情況。

請輸入圖片描述

 

儘量使用Untiy來生成Lightma UVs,手動處理的UV片段在光照圖上還是會重新佈局,而且比Unity自動UV耗費更多的預處理時間。Unity自動處理UV時,在Lightmap上逐個排布UV片段;不使用Unity的Generate Lightmap UVs的情況下,會使用物件本身的2號UV信息作爲光照圖的UV信息,還需要從手動處理好的合併的UV佈局中找到UV片段進行排布。

有時很難通過自動分UV得到理想的UV分佈,這種情況下需要手動處理模型的2號UV,手動處理UV時重點考慮減少UV片段,保持UV沒有扭曲。

請輸入圖片描述
Unity自動生成UV與在3DS MAX中手動處理爲連續的2號UV的效果對比

 

在手動處理2號UV時需要注意,如果導出的一個物體有多個子Mesh的情況,所有子Mesh都需要手動處理2號UV,否則不勾選Generate Lightmap UVs時,獲取不到2號UV的數據,會導致烘焙結果爲黑色。舉例來說,這裏的樹幹和樹葉會合並導出爲一個物體,不能只在3DS MAX中單獨修改樹幹的2號UV,樹葉也需要Unwrap生成2號UV的數據。

請輸入圖片描述

 

3.3 影響光照圖的佔用像素的參數

單個物件在光照圖上佔用的像素受到多個參數影響,在UV Charting Control參數不變的情況下,主要受全局參數Lightmap Resolution和每個物件的Scale In Lightmap參數影響。

請輸入圖片描述

 

LightmapPadding決定物件之間在光照圖上間隔的像素,LightmapSize決定單張光照圖的最大尺寸,當一張光照圖容納不下所有的物件對應的光照像素時,會烘焙得到多張光照圖。

1)Lightmap Resolution
選擇合適的Lightmap Resolution很重要,它是一個控制場景的光照圖佔用總像素的全局值。官方推薦的Lightmap Resolution值,場景比例與世界單位一致(1unit=1米)的情況下,室外場景0.5~1,室內2~3,地形0.1~0.5。我們以1米爲一個單位,對於一個豐富的室內小場景,有很多不同的燈光和反彈照明,那麼光照圖的分辨率可以設置2~3像素/單位,可以容納更多的燈光細節。如果是一個很大的室外場景,遊戲世界的比例會更大一些,也許一個物體的表面可以達到上百甚至上千米,單個表面同時受到燈光的種類比較少,這種情況下,對物件可設置光照圖的分辨率在0.5~1像素/單位,對地形可以設置爲0.1~0.5像素/單位。在舊版本的烘焙技術中,因爲烘焙陰影需要較高的精度,Realtime Resolution可能設置到10~30,而Mixed Lighting烘焙模式推薦使用間接光照與實時陰影,對烘焙陰影的要求降低了很多。因此,需要根據實際場景的規模、使用的烘焙模式、烘焙效果的要求等綜合考慮,選擇一個合適的值。

2)Scale In Lightmap
有一種錯誤的理解是,面積大的物件就應該設置更高的光照圖精度和光照計算精度。實際上,光照圖分辨率不變的情況下,物體在光照圖上佔用的像素也會隨物體的大小發生變化。精細的小物件可能需要設置更高的精度。

請輸入圖片描述

 

畫面左側爲舊的調整方式,將大物件的Scale In Lightmap的參數調高到3甚至5,將小物件的參數調低到0.5甚至0.1,手動修改物件的參數且不合理。

畫面右側爲新的流程,提前將Scale In Lightmap和Lightmap Parameters配置存儲到Prefab中,場景搭建好後光照精度比例已經成型,只需要根據最後的烘焙結果調整場景中的特殊情況,大部分細碎的物件不用一一調整,大大減少了手動調整參數的工作量。

在全局Lightmap Resolution的基礎上,通用物件的Scale In Lightmap爲1,爲需要特別設置精度的物件按照分類制定規範,設置不同的精度比例。比如建築物的牆面結構簡單,受光主要是低頻光,參數可調低到0.5;城市街道需要更高的陰影精度,參數可調高到3;野外大面積的地形和大量的植物,參數可調低到0.5;細節較多的主體物件,參數可調高到2。

請輸入圖片描述
Scale In Lightmap調整前後的物件光照精度對比,調整後光照圖的像素佔用分佈更合理

 

3.4 影響光照精度計算的參數

影響烘焙時長的主要因素在於光照精度的計算,主要是Lightmapping Settings上的參數配置。

請輸入圖片描述

 

1)Indirect Resolution
光照計算是以Cluster爲單位發射光線收集光照信息的,Indirect Resolution會影響Cluster數量,修改它會對烘焙速度有提升。通常在光照效果調試階段建議降低精度,確定最終光照參數後再調高來得到最終的烘焙效果。

2)Ambient Occlusion
勾選Ambient Occlusion時,會計算物件之間的遮擋關係,在場景物件數量級較大的情況下,關閉AO計算對烘焙速度有提升。通常在光照效果調試階段建議關掉,確定最終光照參數後再開啓來得到最終的烘焙效果。

請輸入圖片描述

 

3)Final Gather
勾選Final Gather時,會按照Lightmap的分辨率用光線追蹤算法計算光照反彈,RayCount決定了採樣光照計算的射線數量,默認爲256,數值越大,烘焙過程中的計算耗時越長。通常在光照效果調試階段建議關掉,確定最終光照參數後再開啓來得到最終的烘焙效果。

請輸入圖片描述

 

4)Lightmap Parameters

請輸入圖片描述

 

Lightmap Parameters是一組Precomputed Realtime GI的參數集合,可以設定多套參數配置給不同的靜態場景物件使用。對烘焙速度的影響主要體現在Resolution和Cluster Resolution參數。Resolution直接影響了光照計算的精度,一般建議在0.1~2;Cluster Resolution影響Cluster數量,一般建議設爲0.3-0.6;數值越大,烘焙耗時越長。Resolution和Cluster Resolution代表光照計算的精度,不同於Scale In Lightmap,並不影響Lightmap Resolution光照圖的分辨率和最終尺寸。

調整Baked GI的Blur Radius模糊半徑參數可以用來彌補陰影精度不足產生的效果問題。

3.5 場景光照管理和烘焙調試

移動平臺的實時光照需要嚴格控制,儘量在前期考慮好場景物件的分類和分層,方便後期對燈光和陰影進行控制。在實際的製作中,美術可能習慣了發現問題後再進行分類,不管能否提前制定規範,在烘焙流程中都是很重要的一個不容忽視的步驟。

1)配置物件Prefab上的光照參數
搭建一個標準環境,導入模型創建Prefab時,在標準環境下測試模型的2號UV是否合理,調整模型的UV Control與Lightmap參數,按照通用規則設置Prefab上的Scale in Lightmap值和Lightmap Parameters配置。

請輸入圖片描述

 

存儲在Prefab上的光照參數可以認爲是一個全局參數,一個經驗值。場景調用Prefab後,大部分情況不需要再逐個調節參數,對特殊情況進行微調來適應實際場景。在模型的導入階段檢查模型UV、配置物件的光照參數配置,可以節省後期的大量物件的光照配置工作量。

比如城內的街道需要足夠的精度來支持烘焙得到的陰影細節,所以Scale in Lightmap設置爲3,Lightmap Parameters設置爲High;牆面部分結構簡單受光主要是低頻光,Scale in Lightmap可降低到0.5,Lightmap Parameters設置爲Low;根據這些特性進行配置。

2)場景物件的規劃
對物件進行分類可以更快的爲他們分配光照計算,方便我們管理物件,選擇重複對象。舉個例子,場景的父節點爲Environment,包含了所有可見的靜態場景物件,子級按照大小和結構類似的物件來分組,方便統一設置Static參數,方便後期優化。

請輸入圖片描述

 

3)烘焙燈光的規劃

請輸入圖片描述

 

通常我們使用一盞Directional Light作爲主光源來表現材質效果和陰影,屬性爲Mixed。根據場景原畫概念圖中的場景色調和明度初步確定主光源的顏色和強度。主光源的參數Color和Intensity共同決定了場景整體的明暗,可以將 ColorBrightness*Intensity ≈ 1 作爲一個標準參考值,同時也需要考慮環境光的平均亮度、其他輔助燈光的強弱對場景亮度的影響。

根據場景原畫概念圖中陰影的方向初步確定主光源的角度,避免使用過於極端的燈光角度,比如平行於地面或者垂直於地面的角度不利於烘焙效果。

燈光的CullingMask設置爲靜態場景物件和動態角色所在的Layer層,養成手動設置CullingMask的習慣,避免使用Everything。

只有一盞主光源的情況下,烘焙會存在很多暗角,整個場景的色調會比較單一。通常爲了得到更好的烘焙效果,我們會增加額外的平行光來作爲烘焙補光,屬性爲Baked,確定好平行光的方向、顏色和強度。輔助烘焙的平行光不宜超過兩盞,過多的平行光會讓光照複雜而不真實,也會導致更嚴重的溢色問題,所以建議同一方向和同一顏色的平行光只保留一盞,如果烘焙效果的色調不夠豐富,建議通過後期校色來彌補,後期ColorGrading和Lut的開銷在移動平臺還是可以接受的。

增加其他類型的輔助燈光表現細節,在場景中需要光源的位置添加烘焙用的Point Light、Area Light等燈光。

4)預烘焙與最終烘焙方案
場景基本搭建完成後,需要對場景增加細節光照。在Enlighten特性下,如果只修改燈光和燈光參數,可以快速烘焙得到光照圖;而增加、刪除和修改物件,相當於重新烘焙。當場景物件不完全確定時,需要提高烘焙調試的效率。

選擇合適的Realtime Resolution,確定大概的光照圖尺寸。這一階段不需要特別精確,不用過分在意光照圖的總數和佔用情況,在最後的環節微調。

設定兩套全局使用的Lightmap Parameters。

請輸入圖片描述

 

這兩套參數的差異主要在Resolution和ClusterResolution的值,影響烘焙的速度。需要注意,場景中已配置的Lightmap Parameters不受這兩套全局設置的影響。

請輸入圖片描述
左側爲預烘焙方案;右側爲最終烘焙方案

 

預烘焙方案使用第一套Lightmap Parameters-LightmapPreBake,降低Indirect Resolution,並關閉AO和Final Gather,降低Indirect Resolution間接光照計算的精度。調整這些參數會加快烘焙速度,並保證Lightmap的像素佔用不發生變化。

最終烘焙方案使用第二套Lightmap Parameters-LightmapFinalBake,提高Indirect Resolution,並開啓AO和Final Gather,提高Indirect Resolution間接光照計算的精度,使用高配置的烘焙機器,得到高精度的光照計算效果。

請輸入圖片描述
兩種方案的烘焙對比

 

烘焙結果來看,使用預烘焙的方案進行光照調試,烘焙效率較高。烘焙效果有問題的物件及時修改(部分錯誤可以通過修正物件的法線、2號UV來解決),不適合烘焙的物件調整爲Light Probe光照。確定了光照效果後,使用最終烘焙方案得到更多的光照細節。需要注意的是Indirect Resolution會對光照圖的佈局產生影響,在最後的階段確定合適的Realtime Resolution值,讓光照圖的像素利用率最大化。

請輸入圖片描述
在官方教程的例子中,烘焙耗時從7.5hrs優化到2.25mins

 

3.6 其他問題
1)使用Light Probe

Probe lighting是一種近似實時光照的技術,通常用於角色和非靜態物體的照明,在運行時有較高的性能。Probe lighting使用球諧函數採樣3D空間中的點的入射光,這些係數存儲成本低而且能被快速解壓,被shader使用。

請輸入圖片描述

 

使用Probe lighting有一個侷限性,很難計算高頻光,精度不足以計算特殊的可見光輻射範圍。受限於低階球諧函數及性能,Probe lighting不適用於大物件和受光復雜的情況,也不適用於大平面或者表面凹陷的物體;適用於小的、凸面物體。

使用Light Probe的優點:

  • 使用Light
    Probe可以減少Lightmap的像素佔用,並提升烘焙速度。場景中有一部分物件是不適合使用Lightmap的,結構複雜的小物件、UV
    Charts數量不合理的物件、場景中光照單一的物件等。
  • 不受Lightmap影響的物件更方便做優化顯隱。
  • Light Probe的密集程度影響光照計算效率,根據物件所處環境的光照情況進行探針的佈局,需要注意疏密分佈。雖然Light
    Probes的開銷不高,放置Probe時也要考慮到降低性能,放置的太密集也會造成浪費,在需要有明顯變化或者需要強烈的光線反彈顏色的區域才放置密度更高的探針
    。同時,可以製作一份簡版的Light Probe用於低端畫質。

    請輸入圖片描述

  • Light Probe還可以用於LOD Group中低精度模型的光照。
  • 在沒有設置Light Probe的情況下,物體會使用Fallback的Ambient Probe照明,Ambient
    Probe採樣燈光面板中設置的環境光,對用戶不可見。

2)使用Baked Reflection Probe
對特定的不同區域創建多個不同的ReflectionCube。

請輸入圖片描述

 

移動平臺下Reflection Probe的Type一般不使用Realtime而是Baked,設置合適的分辨率,Resolution決定了烘焙得到的Cube的分辨率,一般不超過256。通過Culling Mask設置需要參與反射烘焙的層。

注意設置Box Size的範圍,多個不同的ReflectionCube的區域儘量不要重合,區域重合時會根據物件設置進行混合,有額外的開銷,可以通過GraphicsSettings禁用Reflection Probes Blending。

請輸入圖片描述

 

建議創建一個全局使用的Reflection Probe,烘焙得到一張Texture Shape爲Cube的場景的反射圖,配置在Lighting面板上。在優化時可以禁用場景裏的ReflectionCube,默認會使用Lighting面板上配置的Cubemap。

請輸入圖片描述

 

3)多場景管理光照圖
在光照參數設置合理的情況下,場景的物件越多,烘焙出的光照圖數量就越多,同屏繪製的物件可能佔用到大量不同的光照圖,渲染時內存壓力變大。當地圖尺寸達到2048尺寸後,建議將大場景按照區域拆分爲多個場景,不同區域的物件的光照圖會受到場景的管理,拆分後的小場景的光照圖數量得到了控制,隨着場景的加載和卸載。

4)烘焙硬件配置
最終烘焙時使用配置較高的硬件,烘焙機推薦的硬件配置爲32核心256G內存。

參考文獻:
Untiy5.0更新日誌
https://unity3d.com/cn/unity/whats-new/unity-5.0
Untiy5.6更新日誌
https://unity3d.com/cn/unity/whats-new/unity-5.6.0
Pogressive Lightmapper
https://docs.unity3d.com/Manual/ProgressiveLightmapper.html
Mixed Lighting
https://docs.unity3d.com/Manual/LightMode-Mixed.html
Precompute Process
https://docs.unity3d.com/Manual/UsingPrecomputedLighting.html
Unite 2018 | Lightmap烘焙最佳實踐
https://connect.unity.com/p/unite-2018-lightmaphong-bei-zui-jia-shi-jian
GI-Enlighten
https://docs.unity3d.com/Manual/GI-Enlighten.html
GI-UVs
https://docs.unity3d.com/Manual/LightingGiUvs.html
Tutorials-Graphics-Precomputed Realtime GI
https://unity3d.com/cn/learn/tutorials/topics/graphics/introduction-precomputed-realtime-gi?playlist=17102


文末,再次感謝文雅的分享,如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。(QQ羣:465082844)。
也歡迎大家來積極參與U Sparkle開發者計劃,簡稱"US",代表你和我,代表UWA和開發者在一起!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章