廣義的來(lái)說(shuō),Unity的全局光照是”實(shí)時(shí)”或是”預(yù)先計(jì)算好”的,在某些情況下兩種方法可以結(jié)合使用,照出更逼真的場(chǎng)景。
本節(jié)我們會(huì)針對(duì)兩種技術(shù)的差異優(yōu)勢(shì)和使用時(shí)機(jī)做個(gè)簡(jiǎn)單的描述。
實(shí)時(shí)照明(Realtime Lighting)
預(yù)設(shè)情況下,Unity的燈源(直接光源, 投射燈, 點(diǎn)光源)都是實(shí)時(shí)的,代表這些燈源會(huì)把光線照射到場(chǎng)景并以每一幀的頻率更新,由于光源是可以在場(chǎng)景內(nèi)移動(dòng)的對(duì)象,場(chǎng)景燈光的更新是實(shí)時(shí)的,你可以在游戲窗口和場(chǎng)景窗口看到改變。
實(shí)時(shí)照明的影響:注意到因?yàn)闆](méi)有反射光源的關(guān)系,陰影是全黑的,只有投射光錐體范圍內(nèi)的對(duì)象表面才有光源影響。
實(shí)時(shí)照明是場(chǎng)景里照亮物體最基本的方法,用來(lái)照亮角色和會(huì)動(dòng)的對(duì)象。
可惜的是,Unity實(shí)時(shí)照明里的光線不會(huì)反射,因此我們才導(dǎo)入了全局光照系統(tǒng),啟用了預(yù)先計(jì)算的技術(shù),都是為了表現(xiàn)一個(gè)更逼真的場(chǎng)景。
烘焙全局光照(Baked GI Lighting)
當(dāng)烘焙一張光照貼圖(Lightmap)時(shí),場(chǎng)景內(nèi)的靜態(tài)對(duì)象會(huì)基于光的影響算出一張貼圖成果,并迭在場(chǎng)景對(duì)象之上建立照明效果:
這些”光照貼圖”可以包含場(chǎng)景內(nèi)投射到物體表面的直接光源,以及在不同物體間反射的”間接光源”,這樣的光照貼圖可以透過(guò)物體材質(zhì)上的著色器(Shader)描述像是顏色的表面信息(Albedo)和凹凸(Normals)信息。
烘焙光照所產(chǎn)生出來(lái)的貼圖,是無(wú)法在游戲運(yùn)作的時(shí)候變更運(yùn)算的,因此被定義為靜態(tài)(Static),雖然仍可在這層貼圖上繼續(xù)迭加光源計(jì)算,但兩者已無(wú)法交互運(yùn)算,通常我們采用這光照法來(lái)讓低階的手機(jī)能順利執(zhí)行,解決光在游戲中運(yùn)行的效能問(wèn)題。
預(yù)計(jì)算全局光照(Precomputed Realtime GI Lighting)
雖然傳統(tǒng)的靜態(tài)光照貼圖無(wú)法在游戲執(zhí)行時(shí)改變場(chǎng)景光照條件,但預(yù)先計(jì)算的實(shí)時(shí)全局光照系統(tǒng)能幫我們實(shí)時(shí)運(yùn)算復(fù)雜的場(chǎng)景光源互動(dòng),透過(guò)這種方法,就能建立昏暗的環(huán)境帶有豐富的全局光照反射,并實(shí)時(shí)反映光源的改變。好比做個(gè)日晷,陰影的位置和顏色會(huì)隨著光源移動(dòng)改變,這在原本的烘焙光照系統(tǒng)是無(wú)法達(dá)成的。
為了在合理的幀率實(shí)現(xiàn)這些效果,我們需要在實(shí)時(shí)運(yùn)算之前先將一堆壟長(zhǎng)的數(shù)據(jù)做”預(yù)計(jì)算”,預(yù)計(jì)算負(fù)責(zé)計(jì)算游戲過(guò)程中光的復(fù)雜行為,它可以在時(shí)間空檔時(shí)進(jìn)行計(jì)算,我們稱(chēng)作一個(gè)”脫機(jī)”運(yùn)算。
那么它是如何運(yùn)作的?
最常見(jiàn)的需求是我們希望間接光源能夠列入場(chǎng)景光照貼圖的計(jì)算,幸好,原理上這些間接光源都是從直接光源慢慢轉(zhuǎn)變過(guò)來(lái)的顏色,只有少部分特定情況有比較大幅度的顏色改變,這樣的Unity的全局光照預(yù)計(jì)算,利用間接光源漫反射(diffuse)特性對(duì)運(yùn)算有利。通常好的陰影是透過(guò)即時(shí)光源所計(jì)算出來(lái)的,而非烘焙到光照貼圖,假定我們并不需要太復(fù)雜的細(xì)節(jié)取樣,可以大大降低全局光照所產(chǎn)生的數(shù)據(jù)大小。
透過(guò)預(yù)計(jì)算來(lái)簡(jiǎn)化整個(gè)流程,有效的降低了原本要在游戲中實(shí)時(shí)計(jì)算的全局光照運(yùn)算數(shù)量,如果你要經(jīng)常在游戲中改變光源顏色,旋轉(zhuǎn)光源或是調(diào)整光的強(qiáng)度,甚至對(duì)場(chǎng)景表面做變更,這點(diǎn)就很重要。Unity從表面上采樣底層貼圖,并從廣義定義顏色的值到一個(gè)大型的群組,或是”叢集”,這會(huì)產(chǎn)生一個(gè)低解析的仿真靜態(tài)幾何,以方便我們用來(lái)計(jì)算光照。
基本上,當(dāng)在計(jì)算全局光照時(shí),我們會(huì)針對(duì)靜態(tài)場(chǎng)景周?chē)觥惫廑E追蹤”運(yùn)算,這是非常耗效能的,因此無(wú)法苛求要實(shí)時(shí)運(yùn)算,相反的,Unity把光跡追蹤用在計(jì)算這些表面的叢集關(guān)系 - 在預(yù)計(jì)算”光傳輸”的階段,然后把世界串成一個(gè)網(wǎng)絡(luò)結(jié)構(gòu),我們?cè)陉P(guān)鍵性的游戲過(guò)程就不再需要耗費(fèi)效能的光跡追蹤法。
我們有效的創(chuàng)造出一個(gè)簡(jiǎn)化的算法可以在游戲過(guò)程中變化輸入結(jié)構(gòu),這代表我們可以改變光源或是表面顏色,并很快的看到場(chǎng)景內(nèi)全局光照的影響,算出的結(jié)果產(chǎn)出光照貼圖透過(guò)GPU著色,并和其他照明或是表面混合,最后輸出到屏幕上。
收益和成本(BENEFITS AND COSTS)
雖然可以同時(shí)使用烘焙方式的GI和預(yù)計(jì)算的GI,但要注意是同時(shí)仿真兩個(gè)系統(tǒng),效能負(fù)擔(dān)也會(huì)兩次運(yùn)算的總和,不只是因?yàn)橐獌?chǔ)存兩套光照貼圖在顯卡內(nèi)存,同時(shí)著色器也得付出兩次的處理成本。
最終要選擇哪個(gè)方法還是要取決于你項(xiàng)目的性質(zhì)和預(yù)期的硬件考慮,例如在手機(jī)平臺(tái)上,效能和內(nèi)存限制較高,烘焙的GI法就會(huì)比較適合,如果是在有顯卡的計(jì)算機(jī)上或是游戲機(jī)上執(zhí)行,那可能使用預(yù)計(jì)算實(shí)時(shí)全局光照,或兩個(gè)同時(shí)使用就比較可行。決定采用哪一種方法可以針對(duì)你的目標(biāo)平臺(tái)評(píng)估,記得如果項(xiàng)目要同時(shí)符合幾個(gè)不同的硬件需求,往往都是以效能最高的平臺(tái)為考慮。
預(yù)燈光設(shè)定(Per-Light Settings)
Unity里每盞燈光默認(rèn)的烘焙模式都是”Realtime”,這代表這些燈光仍然會(huì)照亮你的場(chǎng)景,Unity的預(yù)計(jì)算GI系統(tǒng)會(huì)處理間接光。但如果默認(rèn)的烘焙模式是”Baked”,那么這些燈光將會(huì)透過(guò)Unity的烘焙GI系統(tǒng)處理直接光源和間接光源,產(chǎn)生出來(lái)的光照貼圖一旦貼到場(chǎng)景上在執(zhí)行期間是不能改變的。
選擇烘焙模式為”Mixed”的話,場(chǎng)景內(nèi)的靜態(tài)對(duì)象會(huì)被烘焙GI拿去做計(jì)算,然而,不像”Baked”模式,混合模式的燈光仍會(huì)繼續(xù)運(yùn)算即時(shí)光源到非靜態(tài)對(duì)象上,這對(duì)于你想把靜態(tài)環(huán)境烘成光照貼圖,但同時(shí)又希望同樣一盞燈能為會(huì)動(dòng)的角色計(jì)算陰影很有幫助。