Unity 5 中的全局光照技术详解
簡介
全局光照,簡稱GI,是一個用來模擬光的互動和反彈等復雜行為的算法,要精確的仿真全局光照非常有挑戰(zhàn)性,付出的代價也高,正因為如此,現(xiàn)代游戲會先一定程度的預先處理這些計算,而非游戲執(zhí)行時實時運算。
?
同一場景里:沒有照明(左),只有直接光源(中),和有間接光源的全局光照(右)的表現(xiàn),注意顏色如何在不同的表面進行光的”反彈”,產(chǎn)生更真實的結果。
在本文中,我們會描述全局光照如何在Unity里運作,帶領你通過不同的照明技術解釋如何在項目里設定照明,并思考如何透過各種工具幫場景打光。
選擇一個照明專案
廣義的來說,Unity的全局光照是”實時”或是”預先計算好”的,在某些情況下兩種方法可以結合使用,照出更逼真的場景。本節(jié)我們會針對兩種技術的差異優(yōu)勢和使用時機做個簡單的描述。
實時照明(REALTIME LIGHTING)
預設情況下,Unity的燈源(直接光源, 投射燈, 點光源)都是實時的,代表這些燈源會把光線照射到場景并以每一幀的頻率更新,由于光源是可以在場景內(nèi)移動的對象,場景燈光的更新是實時的,你可以在游戲窗口和場景窗口看到改變。
?
實時照明的影響:注意到因為沒有反射光源的關系陰影是全黑的,只有投射光錐體范圍內(nèi)的對象表面才有光源影響。
實時照明是場景里照亮物體最基本的方法,用來照亮角色和會動的對象,可惜的是,Unity實時照明里的光線不會反射,因此我們才導入了全局光照系統(tǒng),啟用了預先計算的技術,都是為了表現(xiàn)一個更逼真的場景。
烘焙全局光照(BAKEDGI LIGHTING)
當烘焙一張光照貼圖(Lightmap)時,場景內(nèi)的靜態(tài)對象會基于光的影響算出一張貼圖成果,并迭在場景對象之上建立照明效果:
?
這些”光照貼圖”可以包含場景內(nèi)投射到物體表面的直接光源,以及在不同物體間反射的”間接光源”,這樣的光照貼圖可以透過物體材質(zhì)上的著色器(Shader)描述像是顏色的表面信息(Albedo)和凹凸(Normals)信息。
烘焙光照所產(chǎn)生出來的貼圖,是無法在游戲運作的時候變更運算的,因此被定義為靜態(tài)(Static),雖然仍可在這層貼圖上繼續(xù)迭加光源計算,但兩者已無法交互運算,通常我們采用這光照法來讓低階的手機能順利執(zhí)行,解決光在游戲中運行的效能問題。
預計算全局光照(PRECOMPUTED REALTIME GI LIGHTING)
雖然傳統(tǒng)的靜態(tài)光照貼圖無法在游戲執(zhí)行時改變場景光照條件,但預先計算的實時全局光照系統(tǒng)能幫我們實時運算復雜的場景光源互動,透過這種方法,就能建立昏暗的環(huán)境帶有豐富的全局光照反射,并實時反映光源的改變。好比做個日晷,陰影的位置和顏色會隨著光源移動改變,這在原本的烘焙光照系統(tǒng)是無法達成的。
?
為了在合理的幀率實現(xiàn)這些效果,我們需要在實時運算之前先將一堆壟長的數(shù)字數(shù)據(jù)做”預計算”,預計算負責計算游戲過程中光的復雜行為,它可以在時間空檔時進行計算,我們稱作一個”脫機”運算。
如何運作?
最常見的需求是我們希望間接光源能夠列入場景光照貼圖的計算,幸好,原理上這些間接光源都是從直接光源慢慢轉(zhuǎn)變過來的顏色,只有少部分特定情況有比較大幅度的顏色改變,這樣的Unity的全局光照預計算,利用間接光源漫反射(diffuse)特性對運算有利。通常好的陰影是透過即時光源所計算出來的,而非烘焙到光照貼圖,假定我們并不需要太復雜的細節(jié)取樣,可以大大降低全局光照所產(chǎn)生的數(shù)據(jù)大小。
透過預計算來簡化整個流程,有效的降低了原本要在游戲中實時計算的全局光照運算數(shù)量,如果你要常在游戲中改變光源顏色,旋轉(zhuǎn)光源或是調(diào)整光的強度,甚至對場景表面做變更,這點就很重要。Unity從表面上采樣底層貼圖,并從廣義定義顏色的值到一個大型的群組,或是”叢集”,這會產(chǎn)生一個低解析的仿真靜態(tài)幾何,以方便我們用來計算光照。
?
左:場景顯示設置為”Albedo”時,可以清楚看到由Unity預計算所產(chǎn)生的紋理;右:如同游戲的場景一樣,即時光照計算完結果后套用到場景。
基本上,當在計算全局光照時,我們會針對靜態(tài)場景周圍做”光跡追蹤”運算,這是非常耗效能的,因此無法苛求要實時運算,相反的,Unity把光跡追蹤用在計算這些表面的叢集關系 - 在預計算”光傳輸”的階段,買二手手機平臺然后把世界串成一個網(wǎng)絡結構,我們在關鍵性的游戲過程就不再需要耗費效能的光跡追蹤法。
我們有效的創(chuàng)造出一個簡化的算法可以在游戲過程中變化輸入結構,這代表我們可以改變光源或是表面顏色,并很快的看到場景內(nèi)全局光照的影響,算出的結果產(chǎn)出光照貼圖透過GPU著色,并和其他照明或是表面混合,最后輸出到屏幕上。
收益和成本(BENEFITS AND COSTS)
雖然可以同時使用烘焙方式的GI和預計算的GI,但要注意是同時仿真兩個系統(tǒng),效能負擔也會兩次運算的總和,不只是因為要儲存兩套光照貼圖在顯卡內(nèi)存,同時著色器也得付出兩次的處理成本。
最終要選擇哪個方法還是要取決于你項目的性質(zhì)和預期的硬件考慮,例如在手機平臺上,效能和內(nèi)存限制較高,烘焙的GI法就會比較適合,如果是在有顯卡的計算機上或是游戲機上執(zhí)行,那可能使用預計算實時全局光照,或兩個同時使用就比較可行。決定采用哪一種方法可以針對你的目標平臺評估,記得如果項目要同時符合幾個不同的硬件需求,往往都是以效能最高的平臺為考慮。
預先計算的過程(THE PRECOMPUTE PROCESS)
在Unity里,預計算是在背景執(zhí)行,不管是自動流程或是手動啟用,計算期間你都可以繼續(xù)編輯你的游戲?qū)ο蠖皇苡绊?#xff0c;預計算的時候會在右下角出現(xiàn)一個進度條,不同的算法會有不同的運算階段,進度條上方也會顯示階段名稱與進度。
從上面的例子可以看出,11個工作已經(jīng)進展到第5個,”叢集”還有108件工作要執(zhí)行完才會到第6個會話,數(shù)值狀態(tài)欄表如下:
?
啟用一個預計算(STARTING A PRECOMPUTE)
只有靜態(tài)對象會被納入GI預計算,要讓預計算啟動首先必須最少要有一個靜態(tài)對象,不管是單獨設定對象或是從層級選單用Shift + 選擇多個對象后一次修改。
從屬性面板,將對象的Static勾選起來,這會將該物體所有跟靜態(tài)對象相關的旗標打開,包含導航旗標或是批處理旗標,這或許不是你想要的,針對預計算只要把”Lighting Static”這個旗標打勾即可。更細部的控制,只要點選屬性接口Static右邊的下拉式選單即可,此外,從Window里的Lighting接口也能指定設定靜態(tài)對象。
如果你的場景設為自動(Lighting->Scene->Auto),Unity的預計算就會自動啟動,否則就需要用下列的流程手動執(zhí)行。
自動/手動預計算(AUTO/MANUALPRECOMPUTE)
假如Lighting接口底下Auto這個選項是被勾選的(Lighting->Scene->Auto),那么預計算就會自動在背景不停的改變場景產(chǎn)出的靜態(tài)幾何。但如果這個勾選沒勾,你將需要點擊在Auto旁邊的”Build”按鈕手動啟動預計算,這會用同樣的方式進行預計算,讓你比較好控制計算的開始時間。手動啟動預計算會對場景所有的照明與各方面進行重新評估并重新計算,如果你希望有選擇性的計算,可以從”Build”旁邊的下拉選單來選擇。
使用烘焙GI或是預計算GI(ENABLINGBAKED GI OR PRECOMPUTED REALTIME GI)
預設情況下,兩種計算法在Unity里都是啟用狀態(tài)(Lighting->Scene),因為如此,你可以針對單獨的光源設定要采用哪種計算法(Inspector->Light->Baking)
在一個場景同時采用兩種方法可能會對效能造成負擔,最好的做法在同一個時間只用一種方法,要關閉任何一種方法可以從GI的接口(Lighting->Scene),把不要用的方法取消打勾即可,只有有打勾的算法會計算,任何相關光的設定都會被覆蓋。
預燈光設定(PRE-LIGHTSETTINGS)
Unity里每盞燈光默認的烘焙模式都是”Realtime”,這代表這些燈光仍然會照亮你的場景,Unity的預計算GI系統(tǒng)會處理間接光。但如果默認的烘焙模式是”Baked”,那么這些燈光將會透過Unity的烘焙GI系統(tǒng)處理直接光源和間接光源,產(chǎn)生出來的光照貼圖一旦貼到場景上在執(zhí)行期間是不能改變的。
?
選擇烘焙模式為”Mixed”的話,場景內(nèi)的靜態(tài)對象會被烘焙GI拿去做計算,然而,不像”Baked”模式,混合模式的燈光仍會繼續(xù)運算即時光源到非靜態(tài)對象上,這對于你想把靜態(tài)環(huán)境烘成光照貼圖,但同時又希望同樣一盞燈能為會動的角色計算陰影很有幫助。
GI快取(GI CACHE)
無論是烘焙還是預計算系統(tǒng),Unity會”緩存”場景的光照數(shù)據(jù)到”GI快取”,并會在計算時嘗試重復運用這些數(shù)據(jù)來節(jié)省時間,你對場景的改變會影響這個數(shù)據(jù)重復利用的多寡。
如果你要清除這個快取可以從(Preference->GICache->Clear Cache)來清除,清除后代表所有數(shù)據(jù)都必須重新運算,因次會花費一些時間,在某些情況下你也許需要降低檔案空間大小(例如要把項目轉(zhuǎn)到另外一臺計算機)是有幫助的。
場景設定(SCENESETUP)
選擇著色路徑(CHOOSING A RENDERING PATH)
Unity支持許多著色技術或”路徑”,在啟動一個項目時,必須要訂出出一個路線,Unity預設是”Forward Rendering”。在”ForwardRendering”里,每個對象著色是根據(jù)每個影響對象的光,透過”Pass”來著色,所以有可能一個對象被重復著色了好幾次,取決于有幾盞燈在作用范圍里。
這種方法的優(yōu)點是快速,也代表硬件需求低,此外,這種正向著色提供了廣泛的自定義”著色模型”,可以快速處理透明度,也支持像是多重采樣柔邊(MSAA)的硬件功能,等等有些在其他路徑上是無法實現(xiàn)的功能,對于圖形質(zhì)量有很大的影響。
然而他的缺點是要為每盞燈光付出相對應的成本,也就是說,對象被越多盞燈光影響,花費的運算成本就越高,有些類型的游戲必需要大量的光源,就會令人望之卻步,反觀如果你能管理好你的燈光數(shù)量,那這個路徑會是一個非常快速的解決方案。
“Deferred”路徑,是延遲了光的遮蔽與混合信息直到第一次接收到的表面的位置 法線 以及材質(zhì)數(shù)據(jù)著色到一個”幾何緩沖器”(G-buffer)作為一個屏幕空間的貼圖,最后合成這些結果,這種方法優(yōu)點是照明的著色成本是和像素數(shù)量成正比,而非燈光數(shù)量,因此你不用再管控場景燈光數(shù)量,某些游戲類型將會是一個關鍵優(yōu)勢。
“Deferred”路徑呈現(xiàn)可預見的效能特點,但通常需要較強大的硬件,對于手機平臺支持度也較低。
關于”Deferred”,”Forward”或是其他路徑的更多信息,可以參閱這里。
選擇一個色彩空間(CHOOSING A COLOR SPACE)
除了要選好著色路徑之外,一開始選擇一個”色彩空間(Color Space)”也是很重要的事情,色彩空間決定采用哪種算法來計算照明或材質(zhì)加載時的顏色混合,這會對游戲的畫面真實感有很大的影響,但大多數(shù)情況下,太超過的色彩空間設定可能會被目標平臺的硬件強制限制。
推薦比較接近真實的色彩空間是Linear,你可以從PlayerSetting里面找到”Color Space”來設定(Edit->ProjectSetting->Player)
設定Linear的優(yōu)點是會讓場景內(nèi)的提供給著色器的顏色也會因為光強度增加變亮,如果換成”Gamma”色彩空間,亮度馬上會轉(zhuǎn)為以白色做為參考,這將不利于圖像的質(zhì)量。
采用Linear和Gamma顏色空間的圖像對照表,可以注意到切換成Gamma時顏色快速的換成以白色為光照強度為基準。
?
Linear另一個好處是著色器能在沒有Gamma補償?shù)那闆r下對貼圖進行取樣,這有助于確保顏色質(zhì)量在經(jīng)過著色管道還能保持一致性,能提高色彩和計算的精度,最后屏幕的輸出結果更為真實。可惜的是Linear顏色空間有些手機平臺甚至有些游戲機不支持,應該說PC或是一些新手機硬件和次世代游戲機才會支持Linear顏色空間,在這種情況下,就得用Gamma方法替代了。
確認你的目標平臺是哪一種之后才選擇適合的顏色空間是很重要的,想要了解更多關于顏色空間的信息,可以參閱這里。
高動態(tài)范圍(HDR)
如同顏色空間,相機的”Dynamic range”動態(tài)范圍是需要指定的,從本質(zhì)上來說,這是用來定義相機截取的最亮與最暗的顏色范圍,要啟用HDR可以從相機組件里把HDR項目打勾即可,要注意的是,某些手機硬件是不支持HDR的,在著色路徑為ForwardRendering并啟用MSAA柔邊時也不支援HDR,HDR和Linear顏色空間一起搭配是最好的,在處理非常明亮的顏色的時候還能保有準確性。
在默認的情況下,Unity是使用低動態(tài)范圍(LDR),顏色會以每個頻道8位儲存三原色(紅 綠 藍),8位確切的意思是用8個0或1的數(shù)字組合成的值,一共會有256種組合,三個頻道256 x256 x 256可以組合出1600萬種色采來表達從黑色到白色不同層度的灰階。
在現(xiàn)實環(huán)境中,顏色遠遠超出1600萬個色階,顏色和亮度的排列甚至遠遠超越了我們?nèi)搜鬯鼙孀R的,同樣的,Unity能夠處理超出這些范圍的顏色并輸出高于LDR設備支持的顏色,用來提供給像是計算機畫面的高質(zhì)量結果,盡管現(xiàn)今輸出裝置仍有很多限制,這些多出來的數(shù)值仍然可有很多的應用。啟用HDR之后,會儲存更大精度的顏色資料(使用浮點運算表示),能處理更多更亮的顏色范圍。
HDR能讓我們在同一畫面下維持兩個巨大差異的亮度,例如場景的陰影區(qū)域和戶外的亮光,我們也可以在環(huán)境場景建立一個”光暈”或發(fā)光特效,透過這些特效或可視的光影效果能增加畫面的真實感,但也要小心處理這些效果以防止他們曝光過度。
色調(diào)映射(TONEMAPPING)
以攝影來比喻的話,如果我們使用不同的曝光度來拍攝我們的場景,我們可以先觀察到哪些顏色會因為曝光過度而遺失,淺色調(diào)在很亮的區(qū)域可能被白色給覆蓋過去,暗色調(diào)可能會被黑色給覆蓋,這像是計算機圖學的”色調(diào)映像”,當顏色在顯示設備(比如計算機屏幕)表現(xiàn)范圍之外時,算法會將顏色修正為裝置合理的顏色并重現(xiàn)在屏幕上,當相機啟用HDR時,建議相機加入Tonemapping這只程序(Assets->ImportPackage->Effects),這只程序可以幫你轉(zhuǎn)換控制超出范圍的顏色成為合理的顏色。
更多關于色調(diào)映像的數(shù)據(jù)可以查看這里。
環(huán)境光(AmbientLighting)
場景中一個照亮整體環(huán)境非常重要的就是”環(huán)境光”,可以說是影響場景光源最全面的一個要素,環(huán)境光很多情況都很有用,也取決于你所選的風格,比如卡通風格的陰影不清楚或燈光是手繪風格,環(huán)境光也很適合用在當你不想單獨調(diào)整場景內(nèi)的燈光但又想要增加整體場景亮度的時候。在沒有使用Unity 5全局光照的功能時,環(huán)境光不會算出準確的物理遮擋,但如果開啟了任何一種GI的情況下,從Skybox照下來的環(huán)境光就能被算出遮擋,結果會更加真實。
在同一個場景之下,左邊是沒有任何光源的場景,右邊則開啟了環(huán)境光,可以注意到調(diào)整環(huán)境光的強度天空盒的亮度并沒有改變。
透過將對象設定為靜態(tài)對象來啟用全局光照的場景,可以注意到光線在不同的表面有遮擋的效果。
?
使用環(huán)境光的好處是耗用效能很低,因此在手機平臺上只要燈光數(shù)量控制得宜也能得到很好的表現(xiàn),你可以從Lighting窗口(Window->Lighting)找到EnvironmentLighting設定區(qū)域(Lighting->Scene),改變Ambient Source來改變環(huán)境光來源。
Ambient Source的默認值是”Skybox”,上圖的天空盒是Unity 5系統(tǒng)產(chǎn)生的一個默認天空盒,帶有一個藍色調(diào)的環(huán)境光,以及一些用該半球體上純色與漸變色的設定。要注意的是改變Lighting里面的AmbientSource并不會讓Skybox的顏色改變,但會影響到場景內(nèi)環(huán)境光照射。
反射源(REFLECTIONSOURCE)
默認的情況下,場景中的對象會使用Unity內(nèi)建的標準著色器(StandardShader)來著色,標準著色器是一個基于物理的著色器(PBS),它會透過模仿真實世界的物理特性像是反射或能量傳遞等來模擬真實世界里光在材質(zhì)上的表現(xiàn)。
當使用標準著色器時,每一個材質(zhì)都會具有一定程度的鏡面反射(specularity)和金屬反射(metalness)屬性,在沒有強大的硬件來處理即時光跡追蹤反射的情況下,我們得仰賴預先計算著色反射,我們使用了一個由六張描述天空的圖片所組成的方體貼圖(Cubemap)或從Unity 5用來從定點搜集環(huán)境信息的反射探頭(Reflection Probe)產(chǎn)生所需的貼圖,然后在和其他光和地表信息混合運算來仿真如同我們真實世界看到的反射效果。
?
場景內(nèi)的對象在默認的情況下會反射天空盒的內(nèi)容,但你可以從Lighting接口里找到ReflectionSource屬性來改變來源,指定一個新的方體貼圖,或指定一個反射探頭來定義。
反射探頭(REFLECTIONPROBES)
天空盒的信息不可能包含所有的場景對象,在許多情況下,對象從天空搜集反射信息時可能會被遮蔽,像是室內(nèi)對象或是在類似橋或是隧道等建筑物里的對象,為了要準確反射這些對象,我們必須用反射探頭針對這些對象取樣,這種探頭從他們的位置對周圍取樣并把結果寫到方體貼圖,可以讓周圍經(jīng)過的物體得到環(huán)境的反射影像。你可以透過GameObject->Light->Reflection Probe來新增一個反射探頭,反射探頭的位置會決定方體貼圖取樣的內(nèi)容,以及反射所看起來的樣子,一般來說,基于效能考慮反射探頭越少越好,請記住,反射探頭并非用來讓物理得到精確結果,而是讓游戲世界有更好的反射,大多數(shù)情況下幾個安排妥當?shù)姆瓷涮筋^就很足夠了。
?
在反射探頭的屬性面板我們可以設定Type為實時(Realtime),烘焙(Baked)或自定義(Custom),需要明白的是,實時反射的設定對效能極為不利,每多一個實時反射探頭就會多出額外六次的著色運算,因此擺設實時的反射探頭應該要有明確的需求,例如反射會閃動的霓虹燈,否則一般來說建議設成烘焙的就夠了,效能也會好很多。
需要注意的是,只有標記為”ReflectionProbe Static”的對象才會被反射探頭取樣,從屬性接口上靜態(tài)對象(Static)的下拉選單打勾即可,相反的,實時的反射探頭會對所有可見的物體取樣,除非你在屏蔽(Mask)選單指定剔除它。
照亮一個場景(LIGHTINGA SCENE)
我們已經(jīng)介紹了一些在Unity里針對場景照明開始工作之前所需要考慮的條件,希望你對目標平臺該用哪些設定已經(jīng)有了一個方向(手機平臺采用烘焙GI和Gamma顏色空間,PC或游戲機采用實時GI和Linear顏色空間),接下來讓我們來看看有哪些協(xié)助制定光源的工具。
定向光源(DIRECTIONALLIGHTS)
“定向光”非常適合用來模擬陽光,它的特性就像是個太陽,定向光能從無限遠的距離投射光源到場景,從定向光發(fā)出來的光線是互相平行的,也不會像其他種光源會分岔,結果就是不管對象離定向光源多遠,投射出來的陰影看起來都一樣,這其實對戶外場景的照明很有利。
?
定向光沒有真正的光源坐標,放置在場景任何地點都不會影響光的效果,只有旋轉(zhuǎn)會影響定向光的照射結果。其他有光源坐標的燈光類型,例如投射燈(Spotlights),角色陰影會因為接近或遠離光源而改變,這也許在照亮室內(nèi)環(huán)境時會是個問題,一般來說,避免角色太接近隱形的光源,我們會建立一個亮點來假裝光源。
使用定向光不用考慮距離,不管多遠它都會影響場景所有的表面(除非被剔除),當使用延遲(Deferred)著色路徑時會造成一些效能損耗,要注意的是,使用這個著色路徑時,光的效能代價和他影響的像素數(shù)目是成正比的,但雖然需要消耗效能,起碼結果較為統(tǒng)一,因此比較容易調(diào)整平衡。
在預設情況下,新的場景都會附帶一盞定向光,在Unity 5里還會與天空盒系統(tǒng)關聯(lián)(Lighting->Scene->Skybox),你也可以刪除預設的定向光并創(chuàng)建一個新的光源,然后從Sun這個屬性重新指定(Lighting->Scene->Sun)
旋轉(zhuǎn)預設的定向光會導致天空盒也跟著更新,如果光的角度和地面平行就可以做出日落的效果,把光源轉(zhuǎn)到天空導致變黑就能做出夜晚的效果,從上往下照就會模擬日間的效果。如果天空盒有指定為環(huán)境光源(Ambient Source),那么天空盒的顏色就會影響環(huán)境里面的對象。
點光源(POINT LIGHTS)
點光源可以想象是在3D空間里一個對著所有方向發(fā)射光線的點,很適合用來制作像是燈泡, 武器發(fā)光或是從物體發(fā)射出來的爆炸效果,點光源的亮度從中心最強一直到范圍屬性(Range)設定的距離遞減到0為止,光的強度從光源到距離成反比,這是所謂的”平方反比定律”,類似光在現(xiàn)實世界的行為。
?
點光源從它的位置對四面八方射出光線,球形的小圖示代表光的”范圍”,光線到達此范圍是會”衰減”到0,但如果有間接光源或反射光則會繼續(xù)投射。
點光源開啟陰影運算是很耗效能的,因此必須謹慎使用,點光源的陰影為了要給六個不同的世界方向會運算六次,在比較差的硬件開啟此功能會造成較大的效能負擔。
當在場景中加入點光源時要注意,目前它們不支持陰影的間接反射,這代表由點光源產(chǎn)生的光線,只要在距離內(nèi)有可能會穿過對象反射到另外一面,這可能會導致墻壁或地板”漏光”,因此放置點光源要格外注意,然而如果是采用Backed GI的話,就不會有這類的問題產(chǎn)生。
聚光燈(SPOTLIGHTS)
聚光燈投射一個錐體在他的Z軸前方,這個錐體的寬度由投射角度(Spot Angle)屬性控制著,光線會從源頭到設定的范圍慢慢衰減到0,同時越靠近錐體邊緣也會衰減,把投射角度的值加大會讓錐體寬度加大,同時也讓邊緣淡化的力度變大,這現(xiàn)象學名叫做”半影”。
?
聚光燈有許多用途,他們可以用來模擬路燈, 壁燈,或許多創(chuàng)意用法,例如模擬手電筒,因為投射區(qū)域能精確的控制,因此很適合用來模擬打在角色身上的光或是模擬舞臺燈光效果等等。光線會因為離源頭越遠而遞減,可以注意到光也會因為越靠近錐體邊緣而變?nèi)?#xff0c;我們稱之為半影區(qū),這會因為錐體角度變大而更明顯。和點光源一樣,使用預計算GI時,聚光燈不支持間接光陰影,這表示燈光會穿過幾何影響到另外一面,因此放置投射燈要特別注意。
區(qū)域光(AREA LIGHTS)
區(qū)域光可以當作是攝影用的柔光燈,在Unity里面他們被定義為單面往Z軸發(fā)射光線的矩形,目前只能和烘焙GI一起使用,區(qū)域光會均勻的照亮作用區(qū)域,雖然區(qū)域光沒有范圍屬性可以調(diào)整,但是光的強度也是會隨著距離光源越遠而遞減。
?
區(qū)域光用在建立柔和的照明效果非常有用,光線在任何方向穿過光的表面時會產(chǎn)生不同方向的折射 - 造成在對象上產(chǎn)生漫反射,常見的用途是拿來當作天花板壁燈或是背光燈,為了實現(xiàn)這功能,我們必須從每個光照貼圖像素上發(fā)射一定數(shù)量的光線,背對著區(qū)域光以確定光有能見度,這代表區(qū)域光的計算是消耗很大的,而且會延長烘焙的時間,但如果運用得宜可以增加場景光的深度,那么消耗就很值得,值得注意的是區(qū)域光只能用在烘焙,因此不影響游戲效能。
發(fā)光材質(zhì)(EMISSIVE MATERIALS)
雖然區(qū)域光不支持實時GI,Unity提供另外一個柔和的燈光效果叫做發(fā)光材質(zhì)(Emissive Materials),和區(qū)域光一樣,發(fā)光材質(zhì)可以讓物體表面發(fā)光,他們可以反射場景內(nèi)像是顏色或是光強度等等能在游戲內(nèi)改變的光源,自發(fā)光(Emission)是一個在標準著色器(Standard Shader)內(nèi)的屬性,允許靜態(tài)對象成為一個發(fā)光體,預設情況下是0,代表指定了這個材質(zhì)并不會有任何的自發(fā)光反應,HDR顏色選擇器能指定發(fā)光顏色,強度能在0-1的范圍調(diào)整,來建立類似區(qū)域光的效果。
發(fā)光材質(zhì)并沒有范圍屬性,但從材質(zhì)發(fā)出的光會以二的次方速度遞減,自發(fā)光材質(zhì)只會作用在有標記為”Static”或”LightmapStatic”卷標的對象,同樣的,如果發(fā)光材質(zhì)附加在非靜態(tài)對象或像是角色的動態(tài)對象則不會有任何作用。
然而,材質(zhì)設定只要emission數(shù)值大于0,即使他們不接收場景光源在畫面上也會有發(fā)光的效果,這種效果也可以透過將emission屬性底下的”Global Illumination”改為”None”,像這樣的自發(fā)光材質(zhì)很適合來模擬霓虹燈等類似的光源。
?
使用Unity標準著色器并附加自發(fā)光材質(zhì)的一個范例,注意從Unity Logo的自發(fā)光也會計算陰影,在這個案例讓球體有了陰影。
發(fā)光材質(zhì)只會影響場景內(nèi)的靜態(tài)對象,如果你想要影響像是角色的動態(tài)對象,就必須采用光探頭系統(tǒng)(Light Probes),在游戲周期改變發(fā)光材質(zhì)的值會更新光探頭取樣,并直接在結果上看到變化。
光探頭(LIGHT PROBES)
靜態(tài)對象只被Unity全局光照GI系統(tǒng)計算,為了使動態(tài)對象能夠和靜態(tài)場景接收到的光影信息互動,我們需要紀錄這些光的信息并做成可以在執(zhí)行期間快速存取的格式。我們在場景放置許多取樣點來截取各個方向搜集來的信息,顏色信息會被編成能在游戲中快速被取出的一組數(shù)值(或系數(shù)),這些取樣點我們稱為”光探頭”。
?
使用了光探頭的場景,注意圖中光探頭放置位置在光線容易變化的地方,例如陰影或是顏色轉(zhuǎn)換的地方。
光探頭允許移動對象接受由全局光照GI所計算出來復雜的反射光源,對象在著色網(wǎng)格的時候會判斷附近光探頭的位置并且把光的信息一并融合計算,這是透過找尋由光探頭所產(chǎn)生的一個四面體,然后決定哪個四面體的落入對象的軸向,這樣就能讓場景內(nèi)的動態(tài)對象正確地接受光信息,如果沒有放置光探頭,動態(tài)對象就無法接受全局光照的信息,造成動態(tài)對象比場景還要暗。
預設的情況下,場景是沒有任何光探頭的,你必須從GameObjects->Light->LightProbe Group自行建立光探頭群組。假如全局光照里的Auto是打勾的(Lighting->Scene->Auto),當光源或是靜態(tài)對象更新時,光探頭信息也會實時更新,沒打勾的話必須點Build運算才會更新。
總結
以上是生活随笔為你收集整理的Unity 5 中的全局光照技术详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机格斗网游该如何避免延迟?
- 下一篇: 游戏测试:如何有效地报告 Bug?