前言:最近在做一個(gè)美術(shù)館的場(chǎng)景,對(duì)于燈光的要求非常高,經(jīng)過(guò)幾天的調(diào)試和在網(wǎng)上查閱一些資料,總結(jié)一下。
全局光照,簡(jiǎn)稱GI,是一個(gè)用來(lái)模擬光的互動(dòng)和反彈等復(fù)雜行為的算法,要精確的仿真全局光照非常有挑戰(zhàn)性,付出的代價(jià)也高,正因?yàn)槿绱?,現(xiàn)代游戲會(huì)先一定程度的預(yù)先處理這些計(jì)算,而非游戲執(zhí)行時(shí)實(shí)時(shí)運(yùn)算。

同一場(chǎng)景里:沒(méi)有照明(左),只有直接光源(中),和有間接光源的全局光照(右)的表現(xiàn),注意顏色如何在不同的表面進(jìn)行光的”反彈”,產(chǎn)生更真實(shí)的結(jié)果。
在本文中,我們會(huì)描述全局光照如何在Unity里運(yùn)作,帶領(lǐng)你通過(guò)不同的照明技術(shù)解釋如何在項(xiàng)目里設(shè)定照明,并思考如何透過(guò)各種工具幫場(chǎng)景打光。
選擇一個(gè)照明專案
廣義的來(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)景。
烘焙全局光照(BAKEDGI LIGHTING)
當(dāng)烘焙一張光照貼圖(Lightmap)時(shí),場(chǎng)景內(nèi)的靜態(tài)對(duì)象會(huì)基于光的影響算出一張貼圖成果,并迭在場(chǎng)景對(duì)象之上建立照明效果:

左:一個(gè)簡(jiǎn)單的光照貼圖場(chǎng)景成果,右:由Unity產(chǎn)生的一張光照貼圖(陰影和光源信息都被納入計(jì)算)
這些”光照貼圖”可以包含場(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á)成的。

一個(gè)用GI呈現(xiàn)的日晷案例
為了在合理的幀率實(shí)現(xiàn)這些效果,我們需要在實(shí)時(shí)運(yùn)算之前先將一堆壟長(zhǎng)的數(shù)字?jǐn)?shù)據(jù)做”預(yù)計(jì)算”,預(yù)計(jì)算負(fù)責(zé)計(jì)算游戲過(guò)程中光的復(fù)雜行為,它可以在時(shí)間空檔時(shí)進(jìn)行計(jì)算,我們稱作一個(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ù)量,如果你要常在游戲中改變光源顏色,旋轉(zhuǎn)光源或是調(diào)整光的強(qiáng)度,甚至對(duì)場(chǎng)景表面做變更,這點(diǎn)就很重要。Unity從表面上采樣底層貼圖,并從廣義定義顏色的值到一個(gè)大型的群組,或是”叢集”,這會(huì)產(chǎn)生一個(gè)低解析的仿真靜態(tài)幾何,以方便我們用來(lái)計(jì)算光照。

左:場(chǎng)景顯示設(shè)置為”Albedo”時(shí),可以清楚看到由Unity預(yù)計(jì)算所產(chǎn)生的紋理;右:如同游戲的場(chǎng)景一樣,即時(shí)光照計(jì)算完結(jié)果后套用到場(chǎng)景。
基本上,當(dāng)在計(jì)算全局光照時(shí),我們會(huì)針對(duì)靜態(tài)場(chǎng)景周圍做”光跡追蹤”運(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ù)先計(jì)算的過(guò)程(THE PRECOMPUTE PROCESS)
在Unity里,預(yù)計(jì)算是在背景執(zhí)行,不管是自動(dòng)流程或是手動(dòng)啟用,計(jì)算期間你都可以繼續(xù)編輯你的游戲?qū)ο蠖皇苡绊?,預(yù)計(jì)算的時(shí)候會(huì)在右下角出現(xiàn)一個(gè)進(jìn)度條,不同的算法會(huì)有不同的運(yùn)算階段,進(jìn)度條上方也會(huì)顯示階段名稱與進(jìn)度。

從上面的例子可以看出,11個(gè)工作已經(jīng)進(jìn)展到第5個(gè),”叢集”還有108件工作要執(zhí)行完才會(huì)到第6個(gè)會(huì)話,數(shù)值狀態(tài)欄表如下:

啟用一個(gè)預(yù)計(jì)算(STARTING A PRECOMPUTE)
只有靜態(tài)對(duì)象會(huì)被納入GI預(yù)計(jì)算,要讓預(yù)計(jì)算啟動(dòng)首先必須最少要有一個(gè)靜態(tài)對(duì)象,不管是單獨(dú)設(shè)定對(duì)象或是從層級(jí)選單用Shift + 選擇多個(gè)對(duì)象后一次修改。
從屬性面板,將對(duì)象的Static勾選起來(lái),這會(huì)將該物體所有跟靜態(tài)對(duì)象相關(guān)的旗標(biāo)打開(kāi),包含導(dǎo)航旗標(biāo)或是批處理旗標(biāo),這或許不是你想要的,針對(duì)預(yù)計(jì)算只要把”Lighting Static”這個(gè)旗標(biāo)打勾即可。更細(xì)部的控制,只要點(diǎn)選屬性接口Static右邊的下拉式選單即可,此外,從Window里的Lighting接口也能指定設(shè)定靜態(tài)對(duì)象。
如果你的場(chǎng)景設(shè)為自動(dòng)(Lighting->Scene->Auto),Unity的預(yù)計(jì)算就會(huì)自動(dòng)啟動(dòng),否則就需要用下列的流程手動(dòng)執(zhí)行。
自動(dòng)/手動(dòng)預(yù)計(jì)算(AUTO/MANUALPRECOMPUTE)
假如Lighting接口底下Auto這個(gè)選項(xiàng)是被勾選的(Lighting->Scene->Auto),那么預(yù)計(jì)算就會(huì)自動(dòng)在背景不停的改變場(chǎng)景產(chǎn)出的靜態(tài)幾何。但如果這個(gè)勾選沒(méi)勾,你將需要點(diǎn)擊在Auto旁邊的”Build”按鈕手動(dòng)啟動(dòng)預(yù)計(jì)算,這會(huì)用同樣的方式進(jìn)行預(yù)計(jì)算,讓你比較好控制計(jì)算的開(kāi)始時(shí)間。手動(dòng)啟動(dòng)預(yù)計(jì)算會(huì)對(duì)場(chǎng)景所有的照明與各方面進(jìn)行重新評(píng)估并重新計(jì)算,如果你希望有選擇性的計(jì)算,可以從”Build”旁邊的下拉選單來(lái)選擇。
使用烘焙GI或是預(yù)計(jì)算GI(ENABLINGBAKED GI OR PRECOMPUTED REALTIME GI)
預(yù)設(shè)情況下,兩種計(jì)算法在Unity里都是啟用狀態(tài)(Lighting->Scene),因?yàn)槿绱?,你可以針?duì)單獨(dú)的光源設(shè)定要采用哪種計(jì)算法(Inspector->Light->Baking)
在一個(gè)場(chǎng)景同時(shí)采用兩種方法可能會(huì)對(duì)效能造成負(fù)擔(dān),最好的做法在同一個(gè)時(shí)間只用一種方法,要關(guān)閉任何一種方法可以從GI的接口(Lighting->Scene),把不要用的方法取消打勾即可,只有有打勾的算法會(huì)計(jì)算,任何相關(guān)光的設(shè)定都會(huì)被覆蓋。
預(yù)燈光設(shè)定(PRE-LIGHTSETTINGS)
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í)行期間是不能改變的。

一個(gè)設(shè)定烘焙模式為”Realtime”的點(diǎn)光源
選擇烘焙模式為”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ì)算陰影很有幫助。
GI快取(GI CACHE)
無(wú)論是烘焙還是預(yù)計(jì)算系統(tǒng),Unity會(huì)”緩存”場(chǎng)景的光照數(shù)據(jù)到”GI快取”,并會(huì)在計(jì)算時(shí)嘗試重復(fù)運(yùn)用這些數(shù)據(jù)來(lái)節(jié)省時(shí)間,你對(duì)場(chǎng)景的改變會(huì)影響這個(gè)數(shù)據(jù)重復(fù)利用的多寡。
如果你要清除這個(gè)快取可以從(Preference->GICache->Clear Cache)來(lái)清除,清除后代表所有數(shù)據(jù)都必須重新運(yùn)算,因次會(huì)花費(fèi)一些時(shí)間,在某些情況下你也許需要降低檔案空間大小(例如要把項(xiàng)目轉(zhuǎn)到另外一臺(tái)計(jì)算機(jī))是有幫助的。
場(chǎng)景設(shè)定(SCENESETUP)
選擇著色路徑(CHOOSING A RENDERING PATH)
Unity支持許多著色技術(shù)或”路徑”,在啟動(dòng)一個(gè)項(xiàng)目時(shí),必須要訂出出一個(gè)路線,Unity預(yù)設(shè)是”Forward Rendering”。在”ForwardRendering”里,每個(gè)對(duì)象著色是根據(jù)每個(gè)影響對(duì)象的光,透過(guò)”P(pán)ass”來(lái)著色,所以有可能一個(gè)對(duì)象被重復(fù)著色了好幾次,取決于有幾盞燈在作用范圍里。
這種方法的優(yōu)點(diǎn)是快速,也代表硬件需求低,此外,這種正向著色提供了廣泛的自定義”著色模型”,可以快速處理透明度,也支持像是多重采樣柔邊(MSAA)的硬件功能,等等有些在其他路徑上是無(wú)法實(shí)現(xiàn)的功能,對(duì)于圖形質(zhì)量有很大的影響。
然而他的缺點(diǎn)是要為每盞燈光付出相對(duì)應(yīng)的成本,也就是說(shuō),對(duì)象被越多盞燈光影響,花費(fèi)的運(yùn)算成本就越高,有些類型的游戲必需要大量的光源,就會(huì)令人望之卻步,反觀如果你能管理好你的燈光數(shù)量,那這個(gè)路徑會(huì)是一個(gè)非??焖俚慕鉀Q方案。
“Deferred”路徑,是延遲了光的遮蔽與混合信息直到第一次接收到的表面的位置 法線 以及材質(zhì)數(shù)據(jù)著色到一個(gè)”幾何緩沖器”(G-buffer)作為一個(gè)屏幕空間的貼圖,最后合成這些結(jié)果,這種方法優(yōu)點(diǎn)是照明的著色成本是和像素?cái)?shù)量成正比,而非燈光數(shù)量,因此你不用再管控場(chǎng)景燈光數(shù)量,某些游戲類型將會(huì)是一個(gè)關(guān)鍵優(yōu)勢(shì)。
“Deferred”路徑呈現(xiàn)可預(yù)見(jiàn)的效能特點(diǎn),但通常需要較強(qiáng)大的硬件,對(duì)于手機(jī)平臺(tái)支持度也較低。
關(guān)于”Deferred”,”Forward”或是其他路徑的更多信息,可以參閱[這里
。
選擇一個(gè)色彩空間(CHOOSING A COLOR SPACE)
除了要選好著色路徑之外,一開(kāi)始選擇一個(gè)”色彩空間(Color Space)”也是很重要的事情,色彩空間決定采用哪種算法來(lái)計(jì)算照明或材質(zhì)加載時(shí)的顏色混合,這會(huì)對(duì)游戲的畫(huà)面真實(shí)感有很大的影響,但大多數(shù)情況下,太超過(guò)的色彩空間設(shè)定可能會(huì)被目標(biāo)平臺(tái)的硬件強(qiáng)制限制。
推薦比較接近真實(shí)的色彩空間是Linear,你可以從PlayerSetting里面找到”Color Space”來(lái)設(shè)定(Edit->ProjectSetting->Player)
設(shè)定Linear的優(yōu)點(diǎn)是會(huì)讓場(chǎng)景內(nèi)的提供給著色器的顏色也會(huì)因?yàn)楣鈴?qiáng)度增加變亮,如果換成”Gamma”色彩空間,亮度馬上會(huì)轉(zhuǎn)為以白色做為參考,這將不利于圖像的質(zhì)量。
采用Linear和Gamma顏色空間的圖像對(duì)照表,可以注意到切換成Gamma時(shí)顏色快速的換成以白色為光照強(qiáng)度為基準(zhǔn)。

Linear另一個(gè)好處是著色器能在沒(méi)有Gamma補(bǔ)償?shù)那闆r下對(duì)貼圖進(jìn)行取樣,這有助于確保顏色質(zhì)量在經(jīng)過(guò)著色管道還能保持一致性,能提高色彩和計(jì)算的精度,最后屏幕的輸出結(jié)果更為真實(shí)??上У氖荓inear顏色空間有些手機(jī)平臺(tái)甚至有些游戲機(jī)不支持,應(yīng)該說(shuō)PC或是一些新手機(jī)硬件和次世代游戲機(jī)才會(huì)支持Linear顏色空間,在這種情況下,就得用Gamma方法替代了。
確認(rèn)你的目標(biāo)平臺(tái)是哪一種之后才選擇適合的顏色空間是很重要的,想要了解更多關(guān)于顏色空間的信息,可以參閱[這里
。
高動(dòng)態(tài)范圍(HDR)
如同顏色空間,相機(jī)的”Dynamic range”動(dòng)態(tài)范圍是需要指定的,從本質(zhì)上來(lái)說(shuō),這是用來(lái)定義相機(jī)截取的最亮與最暗的顏色范圍,要啟用HDR可以從相機(jī)組件里把HDR項(xiàng)目打勾即可,要注意的是,某些手機(jī)硬件是不支持HDR的,在著色路徑為ForwardRendering并啟用MSAA柔邊時(shí)也不支援HDR,HDR和Linear顏色空間一起搭配是最好的,在處理非常明亮的顏色的時(shí)候還能保有準(zhǔn)確性。
在默認(rèn)的情況下,Unity是使用低動(dòng)態(tài)范圍(LDR),顏色會(huì)以每個(gè)頻道8位儲(chǔ)存三原色(紅 綠 藍(lán)),8位確切的意思是用8個(gè)0或1的數(shù)字組合成的值,一共會(huì)有256種組合,三個(gè)頻道256 x256 x 256可以組合出1600萬(wàn)種色采來(lái)表達(dá)從黑色到白色不同層度的灰階。
在現(xiàn)實(shí)環(huán)境中,顏色遠(yuǎn)遠(yuǎn)超出1600萬(wàn)個(gè)色階,顏色和亮度的排列甚至遠(yuǎn)遠(yuǎn)超越了我們?nèi)搜鬯鼙孀R(shí)的,同樣的,Unity能夠處理超出這些范圍的顏色并輸出高于LDR設(shè)備支持的顏色,用來(lái)提供給像是計(jì)算機(jī)畫(huà)面的高質(zhì)量結(jié)果,盡管現(xiàn)今輸出裝置仍有很多限制,這些多出來(lái)的數(shù)值仍然可有很多的應(yīng)用。啟用HDR之后,會(huì)儲(chǔ)存更大精度的顏色資料(使用浮點(diǎn)運(yùn)算表示),能處理更多更亮的顏色范圍。
HDR能讓我們?cè)谕划?huà)面下維持兩個(gè)巨大差異的亮度,例如場(chǎng)景的陰影區(qū)域和戶外的亮光,我們也可以在環(huán)境場(chǎng)景建立一個(gè)”光暈”或發(fā)光特效,透過(guò)這些特效或可視的光影效果能增加畫(huà)面的真實(shí)感,但也要小心處理這些效果以防止他們曝光過(guò)度。
色調(diào)映射(TONEMAPPING)
以攝影來(lái)比喻的話,如果我們使用不同的曝光度來(lái)拍攝我們的場(chǎng)景,我們可以先觀察到哪些顏色會(huì)因?yàn)槠毓膺^(guò)度而遺失,淺色調(diào)在很亮的區(qū)域可能被白色給覆蓋過(guò)去,暗色調(diào)可能會(huì)被黑色給覆蓋,這像是計(jì)算機(jī)圖學(xué)的”色調(diào)映像”,當(dāng)顏色在顯示設(shè)備(比如計(jì)算機(jī)屏幕)表現(xiàn)范圍之外時(shí),算法會(huì)將顏色修正為裝置合理的顏色并重現(xiàn)在屏幕上,當(dāng)相機(jī)啟用HDR時(shí),建議相機(jī)加入Tonemapping這只程序(Assets->ImportPackage->Effects),這只程序可以幫你轉(zhuǎn)換控制超出范圍的顏色成為合理的顏色。
更多關(guān)于色調(diào)映像的數(shù)據(jù)可以查看[這里
。
環(huán)境光(AmbientLighting)
場(chǎng)景中一個(gè)照亮整體環(huán)境非常重要的就是”環(huán)境光”,可以說(shuō)是影響場(chǎng)景光源最全面的一個(gè)要素,環(huán)境光很多情況都很有用,也取決于你所選的風(fēng)格,比如卡通風(fēng)格的陰影不清楚或燈光是手繪風(fēng)格,環(huán)境光也很適合用在當(dāng)你不想單獨(dú)調(diào)整場(chǎng)景內(nèi)的燈光但又想要增加整體場(chǎng)景亮度的時(shí)候。在沒(méi)有使用Unity 5全局光照的功能時(shí),環(huán)境光不會(huì)算出準(zhǔn)確的物理遮擋,但如果開(kāi)啟了任何一種GI的情況下,從Skybox照下來(lái)的環(huán)境光就能被算出遮擋,結(jié)果會(huì)更加真實(shí)。
在同一個(gè)場(chǎng)景之下,左邊是沒(méi)有任何光源的場(chǎng)景,右邊則開(kāi)啟了環(huán)境光,可以注意到調(diào)整環(huán)境光的強(qiáng)度天空盒的亮度并沒(méi)有改變。
透過(guò)將對(duì)象設(shè)定為靜態(tài)對(duì)象來(lái)啟用全局光照的場(chǎng)景,可以注意到光線在不同的表面有遮擋的效果。


使用環(huán)境光的好處是耗用效能很低,因此在手機(jī)平臺(tái)上只要燈光數(shù)量控制得宜也能得到很好的表現(xiàn),你可以從Lighting窗口(Window->Lighting)找到EnvironmentLighting設(shè)定區(qū)域(Lighting->Scene),改變Ambient Source來(lái)改變環(huán)境光來(lái)源。
Ambient Source的默認(rèn)值是”Skybox”,上圖的天空盒是Unity 5系統(tǒng)產(chǎn)生的一個(gè)默認(rèn)天空盒,帶有一個(gè)藍(lán)色調(diào)的環(huán)境光,以及一些用該半球體上純色與漸變色的設(shè)定。要注意的是改變Lighting里面的AmbientSource并不會(huì)讓Skybox的顏色改變,但會(huì)影響到場(chǎng)景內(nèi)環(huán)境光照射。
反射源(REFLECTIONSOURCE)
默認(rèn)的情況下,場(chǎng)景中的對(duì)象會(huì)使用Unity內(nèi)建的標(biāo)準(zhǔn)著色器(StandardShader)來(lái)著色,標(biāo)準(zhǔn)著色器是一個(gè)基于物理的著色器(PBS),它會(huì)透過(guò)模仿真實(shí)世界的物理特性像是反射或能量傳遞等來(lái)模擬真實(shí)世界里光在材質(zhì)上的表現(xiàn)。
當(dāng)使用標(biāo)準(zhǔn)著色器時(shí),每一個(gè)材質(zhì)都會(huì)具有一定程度的鏡面反射(specularity)和金屬反射(metalness)屬性,在沒(méi)有強(qiáng)大的硬件來(lái)處理即時(shí)光跡追蹤反射的情況下,我們得仰賴預(yù)先計(jì)算著色反射,我們使用了一個(gè)由六張描述天空的圖片所組成的方體貼圖(Cubemap)或從Unity 5用來(lái)從定點(diǎn)搜集環(huán)境信息的反射探頭(Reflection Probe)產(chǎn)生所需的貼圖,然后在和其他光和地表信息混合運(yùn)算來(lái)仿真如同我們真實(shí)世界看到的反射效果。

在預(yù)設(shè)的情況下,調(diào)高Specular和Metalness會(huì)更清楚的反射天空盒,反射的來(lái)源可以從設(shè)定來(lái)調(diào)整。
場(chǎng)景內(nèi)的對(duì)象在默認(rèn)的情況下會(huì)反射天空盒的內(nèi)容,但你可以從Lighting接口里找到ReflectionSource屬性來(lái)改變來(lái)源,指定一個(gè)新的方體貼圖,或指定一個(gè)反射探頭來(lái)定義。
反射探頭(REFLECTIONPROBES)
天空盒的信息不可能包含所有的場(chǎng)景對(duì)象,在許多情況下,對(duì)象從天空搜集反射信息時(shí)可能會(huì)被遮蔽,像是室內(nèi)對(duì)象或是在類似橋或是隧道等建筑物里的對(duì)象,為了要準(zhǔn)確反射這些對(duì)象,我們必須用反射探頭針對(duì)這些對(duì)象取樣,這種探頭從他們的位置對(duì)周圍取樣并把結(jié)果寫(xiě)到方體貼圖,可以讓周圍經(jīng)過(guò)的物體得到環(huán)境的反射影像。你可以透過(guò)GameObject->Light->Reflection Probe來(lái)新增一個(gè)反射探頭,反射探頭的位置會(huì)決定方體貼圖取樣的內(nèi)容,以及反射所看起來(lái)的樣子,一般來(lái)說(shuō),基于效能考慮反射探頭越少越好,請(qǐng)記住,反射探頭并非用來(lái)讓物理得到精確結(jié)果,而是讓游戲世界有更好的反射,大多數(shù)情況下幾個(gè)安排妥當(dāng)?shù)姆瓷涮筋^就很足夠了。

左圖:場(chǎng)景只有預(yù)設(shè)的反射設(shè)定 右圖:場(chǎng)景加入了反射探頭后的結(jié)果
在反射探頭的屬性面板我們可以設(shè)定Type為實(shí)時(shí)(Realtime),烘焙(Baked)或自定義(Custom),需要明白的是,實(shí)時(shí)反射的設(shè)定對(duì)效能極為不利,每多一個(gè)實(shí)時(shí)反射探頭就會(huì)多出額外六次的著色運(yùn)算,因此擺設(shè)實(shí)時(shí)的反射探頭應(yīng)該要有明確的需求,例如反射會(huì)閃動(dòng)的霓虹燈,否則一般來(lái)說(shuō)建議設(shè)成烘焙的就夠了,效能也會(huì)好很多。
需要注意的是,只有標(biāo)記為”ReflectionProbe Static”的對(duì)象才會(huì)被反射探頭取樣,從屬性接口上靜態(tài)對(duì)象(Static)的下拉選單打勾即可,相反的,實(shí)時(shí)的反射探頭會(huì)對(duì)所有可見(jiàn)的物體取樣,除非你在屏蔽(Mask)選單指定剔除它。
照亮一個(gè)場(chǎng)景(LIGHTINGA SCENE)
我們已經(jīng)介紹了一些在Unity里針對(duì)場(chǎng)景照明開(kāi)始工作之前所需要考慮的條件,希望你對(duì)目標(biāo)平臺(tái)該用哪些設(shè)定已經(jīng)有了一個(gè)方向(手機(jī)平臺(tái)采用烘焙GI和Gamma顏色空間,PC或游戲機(jī)采用實(shí)時(shí)GI和Linear顏色空間),接下來(lái)讓我們來(lái)看看有哪些協(xié)助制定光源的工具。
定向光源(DIRECTIONALLIGHTS)
“定向光”非常適合用來(lái)模擬陽(yáng)光,它的特性就像是個(gè)太陽(yáng),定向光能從無(wú)限遠(yuǎn)的距離投射光源到場(chǎng)景,從定向光發(fā)出來(lái)的光線是互相平行的,也不會(huì)像其他種光源會(huì)分岔,結(jié)果就是不管對(duì)象離定向光源多遠(yuǎn),投射出來(lái)的陰影看起來(lái)都一樣,這其實(shí)對(duì)戶外場(chǎng)景的照明很有利。

定向光沒(méi)有真正的光源坐標(biāo),放置在場(chǎng)景任何地點(diǎn)都不會(huì)影響光的效果,只有旋轉(zhuǎn)會(huì)影響定向光的照射結(jié)果。其他有光源坐標(biāo)的燈光類型,例如投射燈(Spotlights),角色陰影會(huì)因?yàn)榻咏蜻h(yuǎn)離光源而改變,這也許在照亮室內(nèi)環(huán)境時(shí)會(huì)是個(gè)問(wèn)題,一般來(lái)說(shuō),避免角色太接近隱形的光源,我們會(huì)建立一個(gè)亮點(diǎn)來(lái)假裝光源。
使用定向光不用考慮距離,不管多遠(yuǎn)它都會(huì)影響場(chǎng)景所有的表面(除非被剔除),當(dāng)使用延遲(Deferred)著色路徑時(shí)會(huì)造成一些效能損耗,要注意的是,使用這個(gè)著色路徑時(shí),光的效能代價(jià)和他影響的像素?cái)?shù)目是成正比的,但雖然需要消耗效能,起碼結(jié)果較為統(tǒng)一,因此比較容易調(diào)整平衡。
在預(yù)設(shè)情況下,新的場(chǎng)景都會(huì)附帶一盞定向光,在Unity 5里還會(huì)與天空盒系統(tǒng)關(guān)聯(lián)(Lighting->Scene->Skybox),你也可以刪除預(yù)設(shè)的定向光并創(chuàng)建一個(gè)新的光源,然后從Sun這個(gè)屬性重新指定(Lighting->Scene->Sun)
旋轉(zhuǎn)預(yù)設(shè)的定向光會(huì)導(dǎo)致天空盒也跟著更新,如果光的角度和地面平行就可以做出日落的效果,把光源轉(zhuǎn)到天空導(dǎo)致變黑就能做出夜晚的效果,從上往下照就會(huì)模擬日間的效果。如果天空盒有指定為環(huán)境光源(Ambient Source),那么天空盒的顏色就會(huì)影響環(huán)境里面的對(duì)象。
點(diǎn)光源(POINT LIGHTS)
點(diǎn)光源可以想象是在3D空間里一個(gè)對(duì)著所有方向發(fā)射光線的點(diǎn),很適合用來(lái)制作像是燈泡, 武器發(fā)光或是從物體發(fā)射出來(lái)的爆炸效果,點(diǎn)光源的亮度從中心最強(qiáng)一直到范圍屬性(Range)設(shè)定的距離遞減到0為止,光的強(qiáng)度從光源到距離成反比,這是所謂的”平方反比定律”,類似光在現(xiàn)實(shí)世界的行為。

點(diǎn)光源從它的位置對(duì)四面八方射出光線,球形的小圖示代表光的”范圍”,光線到達(dá)此范圍是會(huì)”衰減”到0,但如果有間接光源或反射光則會(huì)繼續(xù)投射。
點(diǎn)光源開(kāi)啟陰影運(yùn)算是很耗效能的,因此必須謹(jǐn)慎使用,點(diǎn)光源的陰影為了要給六個(gè)不同的世界方向會(huì)運(yùn)算六次,在比較差的硬件開(kāi)啟此功能會(huì)造成較大的效能負(fù)擔(dān)。
當(dāng)在場(chǎng)景中加入點(diǎn)光源時(shí)要注意,目前它們不支持陰影的間接反射,這代表由點(diǎn)光源產(chǎn)生的光線,只要在距離內(nèi)有可能會(huì)穿過(guò)對(duì)象反射到另外一面,這可能會(huì)導(dǎo)致墻壁或地板”漏光”,因此放置點(diǎn)光源要格外注意,然而如果是采用Backed GI的話,就不會(huì)有這類的問(wèn)題產(chǎn)生。
聚光燈(SPOTLIGHTS)
聚光燈投射一個(gè)錐體在他的Z軸前方,這個(gè)錐體的寬度由投射角度(Spot Angle)屬性控制著,光線會(huì)從源頭到設(shè)定的范圍慢慢衰減到0,同時(shí)越靠近錐體邊緣也會(huì)衰減,把投射角度的值加大會(huì)讓錐體寬度加大,同時(shí)也讓邊緣淡化的力度變大,這現(xiàn)象學(xué)名叫做”半影”。


聚光燈有許多用途,他們可以用來(lái)模擬路燈, 壁燈,或許多創(chuàng)意用法,例如模擬手電筒,因?yàn)橥渡鋮^(qū)域能精確的控制,因此很適合用來(lái)模擬打在角色身上的光或是模擬舞臺(tái)燈光效果等等。光線會(huì)因?yàn)殡x源頭越遠(yuǎn)而遞減,可以注意到光也會(huì)因?yàn)樵娇拷F體邊緣而變?nèi)?,我們稱之為半影區(qū),這會(huì)因?yàn)殄F體角度變大而更明顯。和點(diǎn)光源一樣,使用預(yù)計(jì)算GI時(shí),聚光燈不支持間接光陰影,這表示燈光會(huì)穿過(guò)幾何影響到另外一面,因此放置投射燈要特別注意。
區(qū)域光(AREA LIGHTS)
區(qū)域光可以當(dāng)作是攝影用的柔光燈,在Unity里面他們被定義為單面往Z軸發(fā)射光線的矩形,目前只能和烘焙GI一起使用,區(qū)域光會(huì)均勻的照亮作用區(qū)域,雖然區(qū)域光沒(méi)有范圍屬性可以調(diào)整,但是光的強(qiáng)度也是會(huì)隨著距離光源越遠(yuǎn)而遞減。

區(qū)域光照亮表面并在區(qū)間產(chǎn)生漫反射與柔和的陰影
區(qū)域光用在建立柔和的照明效果非常有用,光線在任何方向穿過(guò)光的表面時(shí)會(huì)產(chǎn)生不同方向的折射 - 造成在對(duì)象上產(chǎn)生漫反射,常見(jiàn)的用途是拿來(lái)當(dāng)作天花板壁燈或是背光燈,為了實(shí)現(xiàn)這功能,我們必須從每個(gè)光照貼圖像素上發(fā)射一定數(shù)量的光線,背對(duì)著區(qū)域光以確定光有能見(jiàn)度,這代表區(qū)域光的計(jì)算是消耗很大的,而且會(huì)延長(zhǎng)烘焙的時(shí)間,但如果運(yùn)用得宜可以增加場(chǎng)景光的深度,那么消耗就很值得,值得注意的是區(qū)域光只能用在烘焙,因此不影響游戲效能。
發(fā)光材質(zhì)(EMISSIVE MATERIALS)
雖然區(qū)域光不支持實(shí)時(shí)GI,Unity提供另外一個(gè)柔和的燈光效果叫做發(fā)光材質(zhì)(Emissive Materials),和區(qū)域光一樣,發(fā)光材質(zhì)可以讓物體表面發(fā)光,他們可以反射場(chǎng)景內(nèi)像是顏色或是光強(qiáng)度等等能在游戲內(nèi)改變的光源,自發(fā)光(Emission)是一個(gè)在標(biāo)準(zhǔn)著色器(Standard Shader)內(nèi)的屬性,允許靜態(tài)對(duì)象成為一個(gè)發(fā)光體,預(yù)設(shè)情況下是0,代表指定了這個(gè)材質(zhì)并不會(huì)有任何的自發(fā)光反應(yīng),HDR顏色選擇器能指定發(fā)光顏色,強(qiáng)度能在0-1的范圍調(diào)整,來(lái)建立類似區(qū)域光的效果。
發(fā)光材質(zhì)并沒(méi)有范圍屬性,但從材質(zhì)發(fā)出的光會(huì)以二的次方速度遞減,自發(fā)光材質(zhì)只會(huì)作用在有標(biāo)記為”Static”或”LightmapStatic”卷標(biāo)的對(duì)象,同樣的,如果發(fā)光材質(zhì)附加在非靜態(tài)對(duì)象或像是角色的動(dòng)態(tài)對(duì)象則不會(huì)有任何作用。
然而,材質(zhì)設(shè)定只要emission數(shù)值大于0,即使他們不接收?qǐng)鼍肮庠丛诋?huà)面上也會(huì)有發(fā)光的效果,這種效果也可以透過(guò)將emission屬性底下的”Global Illumination”改為”None”,像這樣的自發(fā)光材質(zhì)很適合來(lái)模擬霓虹燈等類似的光源。

使用Unity標(biāo)準(zhǔn)著色器并附加自發(fā)光材質(zhì)的一個(gè)范例,注意從Unity Logo的自發(fā)光也會(huì)計(jì)算陰影,在這個(gè)案例讓球體有了陰影。
發(fā)光材質(zhì)只會(huì)影響場(chǎng)景內(nèi)的靜態(tài)對(duì)象,如果你想要影響像是角色的動(dòng)態(tài)對(duì)象,就必須采用光探頭系統(tǒng)(Light Probes),在游戲周期改變發(fā)光材質(zhì)的值會(huì)更新光探頭取樣,并直接在結(jié)果上看到變化。
光探頭(LIGHT PROBES)
靜態(tài)對(duì)象只被Unity全局光照GI系統(tǒng)計(jì)算,為了使動(dòng)態(tài)對(duì)象能夠和靜態(tài)場(chǎng)景接收到的光影信息互動(dòng),我們需要紀(jì)錄這些光的信息并做成可以在執(zhí)行期間快速存取的格式。我們?cè)趫?chǎng)景放置許多取樣點(diǎn)來(lái)截取各個(gè)方向搜集來(lái)的信息,顏色信息會(huì)被編成能在游戲中快速被取出的一組數(shù)值(或系數(shù)),這些取樣點(diǎn)我們稱為”光探頭”。

使用了光探頭的場(chǎng)景,注意圖中光探頭放置位置在光線容易變化的地方,例如陰影或是顏色轉(zhuǎn)換的地方。
光探頭允許移動(dòng)對(duì)象接受由全局光照GI所計(jì)算出來(lái)復(fù)雜的反射光源,對(duì)象在著色網(wǎng)格的時(shí)候會(huì)判斷附近光探頭的位置并且把光的信息一并融合計(jì)算,這是透過(guò)找尋由光探頭所產(chǎn)生的一個(gè)四面體,然后決定哪個(gè)四面體的落入對(duì)象的軸向,這樣就能讓場(chǎng)景內(nèi)的動(dòng)態(tài)對(duì)象正確地接受光信息,如果沒(méi)有放置光探頭,動(dòng)態(tài)對(duì)象就無(wú)法接受全局光照的信息,造成動(dòng)態(tài)對(duì)象比場(chǎng)景還要暗。
預(yù)設(shè)的情況下,場(chǎng)景是沒(méi)有任何光探頭的,你必須從GameObjects->Light->LightProbe Group自行建立光探頭群組。假如全局光照里的Auto是打勾的(Lighting->Scene->Auto),當(dāng)光源或是靜態(tài)對(duì)象更新時(shí),光探頭信息也會(huì)實(shí)時(shí)更新,沒(méi)打勾的話必須點(diǎn)Build運(yùn)算才會(huì)更新。
*注:此篇文獻(xiàn)參考cocopeng整理與Unity 5 -Lighting And Rendering