【Unity】第13章 光照貼圖和光影效果

分類:Unity、C#、VS2015app

建立日期:2016-05-19編輯器

1、簡介

在Unity 5中,Lighting是—種加強場景光照和陰影效果的技術,它能夠經過較少的性能消耗使靜態場景看上去更真實、豐富,以及更具備立體感,又能夠對動態對象進行處理。性能

早期版本的Unity 4只能對「靜態」對象和「動態」對象分別進行處理,稱爲Lightmapping(光照貼圖),可是,Lightmapping不能被用來實時地處理「動態」光照;而在Unity 5中,與Lightmapping相關的功能被從新整合在Unity引擎中並經過【Window】->【Lighting】打開設置窗口,在Lighting窗口中,開發人員只須要簡單的操做,就能夠製做出平滑、真實且不生硬的光影效果。htm

Light Probes是一種在運行時將「動態對象」融入「靜態場景」的技術,利用它可解決實時處理「動態」光照的問題。其基本原理是:先在場景空間中放置一些採樣點來收集其周圍的明暗信息,而後在運行時對動態對象鄰近的採樣點進行插值運算,並將插值結果做用於動態對象上。因爲插值運算並不會耗費太多的性能,所以這種方式既能實現動態遊戲對象和靜態場景的實時融合效果,又不會致使內存資源的極大消耗。對象

2、全局光照(GI)

使用Unity 5提供的功能實現光照貼圖和光影效果前,首先須要掌握兩個基本概念:一個是GI,另外一個是Realtime GI。blog

GI(Global Illumination,全局光照)是指世界座標系(Global)中模型A被光照射後反射到其餘模型表面的光(間接光),而不是光源直接照射到模型A的直接光。例如,陽光照在紅色的沙發上會致使紅光反彈到它背後的牆上,從而使牆看上去也有淺淺的紅色光照效果。另外一個例子是陽光照射在頂部只有一個小口的房間裏,這會致使該房間內的其餘部分也被物體反彈(反射)的光照亮了。遊戲

下圖是一個應用了全局光照(GI)效果的場景,在這個圖中,因爲反彈光(間接光)的做用,致使整個場景看起來明亮、華麗、更具備立體真實感。內存

image

傳統的電影技術通常只有直接光(如直射光、點光、……等光源)產生的效果,當實時地模擬間接光產生的效果時,因爲模擬間接光須要進行大量的計算,會致使電影播放性能大大下降,於是在實際的電影製做時通常分兩步來作這件事:前期拍攝和後期製做。資源

在Unity中,這種相似於電影前期拍攝的工做稱爲預處理。預處理是在Unity編輯器中進行的,主要針對靜態的對象進行處理,該技術稱爲Baked GI(也叫Baked Lightmaps),即預先對間接光進行烘培(Bake)處理,烘培的目標是場景中事先被標記爲Static的對象;而相似於電影后期製做的工做在Unity中稱爲Light Probes,即先經過在場景中添加一些採光點(採樣點),再在運行時利用採光點的反彈(間接光)效果照亮其周圍,從而使整個場景看起來明亮華麗、賞心悅目。開發

在Unity 5.0以前的版本中,這種將Baked GI和Light Probes組合起來的技術就是全局光照(GI),也叫光照貼圖(lightmaps)。換言之,先在Unity編輯狀態下對場景中的靜態對象進行「預處理」,而後再在運行時利用Light Probes進行後期處理。這樣一來,遊戲運行的場面看起來就會明亮、華麗、氣派。

3、實時GI(Realtime GI)

除了全局光照技術(GI)之外,Unity從5.0開始,又提供了一種新的稱爲「Precomputed Realtime GI」的技術,其原理相似於5.0之前的早期版本提供的Baked GI技術。不過,雖然該技術針對的仍然是靜態的對象(即僅限於對被標識爲static的對象進行處理),可是,它和Baked GI最主要的區別是:經過「Precomputed Realtime GI」預處理的結果還能夠直接用於運行時(runtime)的動態對象照明。其實現原理是:Unity先把預先烘培(Bake)的信息(位置、方向、顏色、……等屬性)保存下來,這樣一來在運行時就能夠直接經過這些預處理信息對動態對象進行照明處理了。換言之,在Unity 5中,只須要經過「Realtime GI」技術,就能夠在運行時大大提升照明渲染處理的性能,而不須要再使用Baked GI+Light Probes進行組合處理了。

4、結論

總之,實現全局照明提供光陰效果時,要麼採用方式1(Unity 5以前的早期版本提供的「Baked GI」+「Light Probes」組合起來的技術),要麼採用方式2(從Unity 5.0開始提供的「Precomputed Realtime GI」技術)。可是,不能同時採用方式1和方式2,不然很快就會把內存吃光,從而致使非正常的自動關機(這應該是個新的bug,估計後續的版本會解決這個問題)。

再次提醒注意:「Baked GI」和「Precomputed Realtime GI」都是對「靜態」的對象而言的,即都須要先將被烘培的對象標識爲「Static」才能對其進行照明烘培預處理。而對於動態的對象來講,若是烘培靜態對象時使用的是「Baked GI」技術而不是「Precomputed Realtime GI」技術,那麼還能夠利用預先放置的採光點在運行時經過「Light Probes」實現對動態對象照明;若是烘培靜態對象時使用的是「Precomputed Realtime GI」技術,因爲在運行時它能夠直接對動態對象進行照明處理,所以這種狀況下就不要再使用「Light Probes」了。

相關文章
相關標籤/搜索