Unity 5 全域光照GI與新的烘焙系統初探,unitygi
GI是啥
Realtime GI,即時全域光照,聽上去就是一個非常高大上的詞,但是越高大上就越令人心生敬畏,因為世上沒有免費的午餐,越好的效果意味著越多的消耗,對於移動平台來說,這樣的消耗受不受的起呢?首先來說說GI是幹啥的,非常粗略的來描述下,如果說我們以前的光照系統就是由光源 - 物體 - 視點組成的話,那麼全域光照系統就是由光源 - n多環境反射光 - 物體 - 視點。就是說GI額外包括了環境反射光的計算,它可以使得渲染出來的情境物體間的光影互動更為真實。
如果是離線烘焙的話,n多的環境反射光就是通過輻射度演算法或者是光線追蹤演算法一點點計算出來的,但是即時渲染沒有這麼多的時間。為了實現即時的GI,簡單的說來,Unity(Enlighten GI)需要預計算一些資訊,這些資訊大概包括情境間物體之間的位置、反射關係,以及一個環境反射樹(這些都是我瞎猜的),在即時渲染時,利用這些資訊Unity會動態產生一張間接光照貼圖,像原先的Lightmap一樣只不過上面記錄的是物體表面受到間接光的資訊,這樣在即時渲染時就會看到物體受到反射光的影響了。
因此Unity GI有了如下特點:
而GI產生的開銷主要包括:
GI與Lightmap
看的出來GI的額外效能消耗是可以接受的,我在手機上進行測試,即使是很大很複雜的情境跑起來也完全沒有問題(當然也是因為我是在iPhone6上測的)。不過多數情況下如果說你的情境中不存在光線變化或是動態自發光材質,還是固定鏡頭的話(沒錯,我說的就是RPG),GI對於遊戲來說仍然是沒有用處的,所有GI能做到的事情用簡單的Lightmap就能達到同樣的效果。現在問題來了,Unity配合GI又搞了一個新的烘焙系統,這個系統要怎麼玩兒呢。
首先,現在當你說烘焙時一定要弄明白你想烘焙的是Realtime GI所使用的間接光照圖和情境樹資訊還是Static Lightmap,然後以此決定使用光源的類型是Realtime/Mixed/還是Baked。首先來說烘焙的方式,在Lighting面板中Precomputed Realtime GI 與Baked GI分別對應Realtime GI與Static Lightmap的烘焙。
組合起來就是三種(跟我說你啥都不烘的可以走了):
只烘焙RealtimeGI
關閉Baked GI或者情境中的全部光源類型設定為Realtime。這意味著沒有任何光照顏色會被預先烘焙計算,引擎在烘焙時只是儲存情境內靜態物體間的關係,當烘焙完成後你可以自由的調整光源或物體材質,並即時地看到效果。
此時在Scene中觀察Baked結果可以看到沒有任何靜態顏色被烘焙出來。
在僅使用RealtimeGI時,光源應該選擇Realtime類型。烘焙選項Realtime Resolution對應前文所說的間接光照圖,值越高間接光的效果就越明顯(其實應該是越準確,當解析度太低時間接光會因像素過濾而變弱)
Realtime Resolution = 10
Realtime Resolution = 1
只烘焙Static Lightmap
取消Precomputed Realtime GI的勾選即為同原來一樣的純靜態光照圖烘焙。光源的選擇則同原來一樣,Realtime的燈光不參與烘焙,但同時作用於動態與靜態物體上;Mixed光源參與烘焙,即時運行時僅作用於非靜態物體;Baked光源僅作用於光照烘焙,不參與即時光照計算。
再次觀察SceneView可以看到烘焙出來的顏色。
在Lighting面板中的Lightmaps頁簽中也可以看到烘焙出來的光照圖。咦?怎麼有兩張,稍後解釋
如果使用純Static Lightmap烘焙時會有一個Indirection Resolution的設定,這個設定就對應於Precomputed Realtime GI中的Realtime Resolution,同樣是控制間接光的影響,產生的效果是一樣的。
同時烘焙Static Lightmap與RealtimeGI
如果同時烘焙Static Lightmap與RealtimeGI會發生什麼事情呢?首先光源產生的光照以及物體間的二次反射光線都會被直接烘焙在靜態光照貼圖上,因此前文所提使用GI可以自由即時調整光源或是物體材質的效果在這種烘焙模式下都是沒有用的,但是自發光材質以及天空光產生的輻射光線在這種模式下仍然是可以即時變化併疊加作用於已烘焙的顏色上。
光照烘焙顏色資訊
輻射度資訊
最終合成顏色
輻射度資訊圖中除了自發光的紅色外還有一點點靛青色,這是天空盒產生的顏色,在Environment Lighting中調整Ambient Intensity可以控制天空盒對情境整體明暗的影響。總的來說主體顏色還是靜態烘焙出來的Lightmap控制,但是增加了GI中的動態天空光和自發光。總的來說不建議使用這種方式進行情境渲染,又消耗了靜態Lightmap和GI所需的記憶體,又消耗了GI的計算資源,效果還沒單個使用的好。
在我看來GI最大的好處是可以讓美術即時的看到使用Lightmap烘焙後的情境效果,也就是說首先關閉Baked GI僅烘焙一些Precomputed Realtime GI,隨後美術就可以隨意的調整光源、物體材質、天空盒等數值並即時觀察到情境的最終效果,最後當一切都滿意後關閉Precomputed Realtime GI使用Baked GI進行光照貼圖的烘焙即可。
Lightmap的其他設定(坑)
這裡有大坑,我先挖會兒以後填