Unity 5 全域光照使用小技巧
阿新 • • 發佈:2019-01-29
那既然LightingData檔儲存著lightmapIndex與lightmapScaleOffset,是否只要保證LightingData檔最終能被呼叫不就沒問題了嗎?理論上是,如果我們只需要更換不同燈光條件下的lightmap,場景本身沒有更改的話,那麼多套lightmap對於場景中的靜態物體Renderer而言也只需要同一套lightmapIndex與lightmapScaleOffset資訊而已。
所以這時只要保證lighting視窗的Ligtmaps頁面中Light Data Asset裡選了正確的LightingData檔即可(因為很多開發者習慣性刪除掉這個檔,因此也就遺失了lightmapIndex與lightmapScaleOffset資訊)。
簡單的情況下使用LightingData檔即可。但是還有一種情況,如果場景本身也有所改變怎辦?
例如:我需要原始的場景lightmap與一個被炸彈炸過的場景lightmap,由於場景中的靜態物件改變了,這時兩次烘焙會產生兩個資料不同LightingData檔,無法簡單使用其中一個。 可惜的是現在Unity還不能在執行階段時切換LightingData檔,設計的時候僅僅作為Editor使用。
要解決這問題,我們需要自己記錄每個Renderer上的lightmapIndex與lightmapScaleOffset資訊,然後在更換lightmap的時候把這個資訊還原回去。
總結:具體做法有很多種,基本原理都是把lightmapIndex與lightmapScaleOffset序列化起來。比如說我們可以給每個靜態物件掛一個指令碼,在裡面定義一個包含Render,lightmapIndex與lightmapScaleOffset的結構,然後一個Save函式用來在每次烘焙lightmap之後把lightmapIndex與lightmapScaleOffset序列化進結構中,一個Load函式用來在切換lightmap時還原每個Renderer的lightmapIndex與lightmapScaleOffset資訊。這樣問題就解決了。