Unity預(yù)計(jì)算全局實(shí)時(shí)GI(五)- 探頭光照技術(shù)(Probe lighting)

在理解到當(dāng)在我們的場(chǎng)景中有大量的光照?qǐng)D表時(shí),這對(duì)預(yù)計(jì)算時(shí)間來(lái)說(shuō)是有害的。我們能夠從從預(yù)計(jì)算處理中完全地選擇排除一些對(duì)象物體去極大地提高光照的表現(xiàn)性能。這將會(huì)減少光照?qǐng)D表的數(shù)量。來(lái)取而代之的是,我們可以在這些對(duì)象物體上使用探頭光照(probe lighting),對(duì)于這些使用探頭光照的物體從場(chǎng)景中接受間接光照來(lái)說(shuō),這是一種比較有效率的方式。盡管探頭照亮的物體將不會(huì)對(duì)場(chǎng)景產(chǎn)生反射光照,但這往往是沒(méi)有什么明顯的影響的。對(duì)于適用于采用探頭光照的對(duì)象物體往往是較小的物體,因?yàn)檫@些較小的物體對(duì)反射光的影響不大。

什么是探頭光照(probe lighting)?

探頭光照是在實(shí)時(shí)渲染應(yīng)用中一種快速的近似光照技術(shù)。它通常被用于在游戲世界中的角色以及其他非靜態(tài)(動(dòng)態(tài))對(duì)象物體的光照處理。探頭光照在游戲運(yùn)行時(shí)性能很好而它額外的好處是預(yù)計(jì)算會(huì)很快。

探頭光照的原理,是通過(guò)在3D空間中一個(gè)指定的點(diǎn)來(lái)采樣進(jìn)來(lái)的光照信息,然后用球諧函數(shù)(spherical harmonics)的這種數(shù)學(xué)方法將采樣的光照信息編碼在一個(gè)球體上。這些系數(shù)占用很小的存儲(chǔ)空間,在游戲運(yùn)行時(shí)被快速地”解包"后,被shader所使用,去近似模擬場(chǎng)景中的表面光照。在Unity中這種功能由光照探頭(Light Probes)所提供。

使用光照探頭會(huì)有一些限制。一個(gè)這樣的限制是,難以在不增加這些光照探頭數(shù)量的情況下,在整個(gè)球面范圍內(nèi)表示高頻或斑駁的光照。不幸的是,隨著精度的提高性能開銷也會(huì)迅速升高,這意味著出于性能原因,我們被限制在低階球面諧波函數(shù)。

實(shí)際上,對(duì)于世界中的一個(gè)3D位置只有一個(gè)球形的光照表示,這使得探頭光照不適合用于有大量變化的光照投射在大物體表面的情況。另一個(gè)限制就是當(dāng)用球諧函數(shù)在一個(gè)球體上進(jìn)行編碼時(shí),通常不擅于處理?yè)碛刑卮笃矫娴奈矬w或是帶有很深的凹洞的物體。如果想要將探頭光照技術(shù)用于大型物體,可以參考Unity手冊(cè)中提供的另一個(gè)光照探頭代理體(Light Probe Proxy Volumes, LPPV)技術(shù)做進(jìn)一步了解。

盡管有這些限制,探頭光照技術(shù)還是很適用于和符合條件的小物體一起搭配使用,以較低的成本消耗發(fā)揮出卓越效果。 我們后續(xù)將深入探討如何設(shè)置及擺放光照探頭(Light Probes),現(xiàn)在我們只需要理解,通過(guò)選擇在場(chǎng)景合適的地方使用探頭光照,我們就能減少光照?qǐng)D表的數(shù)量。

選擇用探頭光照的對(duì)象物體

盡管通常我們?yōu)榱诉M(jìn)行光照計(jì)算,將在Environment組下的游戲?qū)ο笪矬w都設(shè)為靜態(tài)物體,但是在這個(gè)Environment父物體對(duì)象下的很多對(duì)象都更適合用探頭光照技術(shù)進(jìn)行處理。清除這些對(duì)象的靜態(tài)標(biāo)簽將意味著他們不會(huì)被Unity的PRGI系統(tǒng)進(jìn)行光照計(jì)算,因此將會(huì)減少光照?qǐng)D表的數(shù)量。請(qǐng)記住加快預(yù)計(jì)算的時(shí)間的關(guān)鍵就是要減少我們場(chǎng)景中光照?qǐng)D表的數(shù)量。


小的,凸的碎片物體對(duì)于探頭光照技術(shù)是完美的適用情況

從Unity編輯器的層級(jí)視圖(Hierarchy)檢查Environment下的子對(duì)象,會(huì)發(fā)現(xiàn)Props對(duì)象物體下的子對(duì)象物體幾乎都是小的,碎片化的點(diǎn)綴場(chǎng)景用的小物體,例如:石頭、水桶或木板。 這些物體非常多,并且展開它們的UV將會(huì)相對(duì)比較復(fù)雜。獲取不失真的光照貼圖UV可能會(huì)產(chǎn)生很多UV Shell,一旦UV Shell過(guò)多就會(huì)需要額外的光照?qǐng)D表,更多的光照?qǐng)D表意味著更多的光照貼圖的紋素需要被計(jì)算,等等.

假設(shè)這些對(duì)象物體如此之小,它們對(duì)場(chǎng)景中不太可能產(chǎn)生很多間接的光照。同時(shí),它們的大小尺寸意味著它們表面能顯示的光照細(xì)節(jié)也有限。所以這樣的物體非常適合用探頭光照技術(shù),由于減少了需要加載到內(nèi)存中以及在shader中解碼的光照貼圖的數(shù)量,不但加快了預(yù)計(jì)算時(shí)間,而且改善了游戲運(yùn)行時(shí)的性能。具體操作如下:

* 從層級(jí)視圖(Hierarchy)選擇Props對(duì)象。

* 在檢視面板(Inspector)中取消勾選最右上角的Static。

* 在彈出的提示框中,選擇"Yes, change children。

對(duì)于這種情況,如果我們留給預(yù)計(jì)算的時(shí)間足夠長(zhǎng)的話,我們最終將會(huì)在場(chǎng)景視圖中看到我們想要的光照結(jié)果。我們將可能會(huì)注意到我們的probe-lit, non-Static 對(duì)象物體會(huì)和它們周圍的物體有明顯的不同,并且和場(chǎng)景中的光照不匹配。這是因?yàn)槲覀冞€沒(méi)有安裝我們的光照探頭,因此這些對(duì)象物體還是在使用場(chǎng)景中的環(huán)境探頭(Ambient Probe)。Ambient Probe本質(zhì)上是一個(gè)在場(chǎng)景中隱藏的探頭,它對(duì)用戶來(lái)說(shuō)是不可見的,它只對(duì)在Lighing window中設(shè)置的Ambient Source進(jìn)行采樣。

圖片展示了非靜態(tài)物體在沒(méi)有使用光照探頭的情況下,在它們所處的環(huán)境中看起來(lái)不一樣

為了讓靜態(tài)物體在它們照亮的環(huán)境獲得更令人滿意的效果,我們需要花點(diǎn)時(shí)間在場(chǎng)景周圍放置光照探頭,以便對(duì)世界中的間接光照進(jìn)行采樣。

放置光照探頭

非靜態(tài)物體會(huì)通過(guò)附近的光照探頭接受光照信息。將光照探頭之間的空間劃為為四面體,然后檢查看給定的對(duì)象物體落在了哪個(gè)四面體中,這樣來(lái)決定一個(gè)對(duì)象物體從哪個(gè)光照探頭去讀取光照信息。為了生成這些四面體,光照探頭因此必須被放置成一個(gè)3D立體的形狀,或者是籠子的形狀。

場(chǎng)景展示了光照探頭的擺放-在編輯器下為發(fā)光的球體

探頭光照技術(shù)在游戲運(yùn)行時(shí)性能開銷比較小而且它可以很快地預(yù)計(jì)算。然而為了性能最優(yōu)化,需要注意的是何時(shí)放置光照探頭。盡管設(shè)置更加快速,但稠密網(wǎng)格狀放置的探頭可能會(huì)浪費(fèi)資源,因?yàn)檫@些光照探頭中的許多在局部光照條件下將不會(huì)采樣很多變化。為了效率,更好的做法是在光照變化明顯的區(qū)域放置密度更高的探頭,例如那些由亮變暗的區(qū)域,或者那些由反射光照造成的濃重顏色的區(qū)域。設(shè)置光照探頭的具體方法如下:

*? 從GameObject 菜單新建一個(gè)光照探頭群組(GameObject > Light > Light Probe Group).

* 現(xiàn)在我們將會(huì)開始放置我們的探頭。在Hierarchy視圖選擇新建Light Probe Group。

* 在 Inspector 面板中,從 Light Probe Group 組件選擇Edit Light Probes開始編輯。

* 你可以在Scene視圖選擇探頭,除了創(chuàng)建的默認(rèn)立方體其中一角上的探頭以外,刪除所有其它的探頭。

* .將環(huán)境中剩余的探頭移動(dòng)剛好到Terrain的上方,然后通過(guò)按下Ctrl+D來(lái)復(fù)制它(在Mac中按下Cmd+D)

* 通過(guò)使用Translate工具,沿著Y軸移動(dòng)這個(gè)第二個(gè)探頭到第一個(gè)探頭上方的2米處。

*?現(xiàn)在再一次的復(fù)制探頭并且沿著Y軸移動(dòng)新復(fù)制出來(lái)的探頭到更遠(yuǎn)的地方,比如5米。

Light Probe Group組件中的Edit Light Probes按鈕

這樣創(chuàng)建一個(gè)垂直的布局的原因是我們能夠從地面,從頭頂附近的高度以及從空中來(lái)采樣間接光照。當(dāng)我們?yōu)榱藙?chuàng)建立體的探頭布局而在場(chǎng)景附近復(fù)制這些光照探頭時(shí),我們想確保這些對(duì)象物體在可玩區(qū)域的任何地方都會(huì)落在由探頭之間生成的立方體中。可以看到光照探頭之間會(huì)以品紅色的線來(lái)繪制這些立方體區(qū)域。

圖片展示了光照探頭的位置以及有這些光照探頭位置組成的立方體區(qū)域

* 通過(guò)按住Shift鍵并且分別點(diǎn)擊每一個(gè)或通過(guò)拖拽一個(gè)框選來(lái)全選三個(gè)你剛剛創(chuàng)建的探頭

*?復(fù)制整個(gè)我們已經(jīng)創(chuàng)建好的垂直鏈并且移動(dòng)它到場(chǎng)景中一個(gè)需要光照采樣的區(qū)域附近

需要采樣的地方不外乎是有陰影的區(qū)域或是地形材質(zhì)色調(diào)會(huì)變化的地方。請(qǐng)記住,我們的目的是對(duì)場(chǎng)景里的間接或反射光照進(jìn)行采樣。?為了讓每個(gè)光照探頭的性能都用在刀刃上,盡量確保它們對(duì)一些光照變化明顯的地方進(jìn)行采樣,如果光照探頭被放在一致性很高的光照區(qū)域,那么當(dāng)接受光照信息的對(duì)象物體通過(guò)這些光照探頭時(shí)我們不太可能看到很多變化。?如同游戲優(yōu)化的許多方面一樣,我們必須確保包含進(jìn)我們場(chǎng)景中的每一個(gè)光照探頭都有它存在的價(jià)值。

*?繼續(xù)重復(fù)這個(gè)過(guò)程,將光照探頭更多地放置在光照變化的區(qū)域,直到創(chuàng)造一個(gè)罩住可玩區(qū)域的籠子一樣的布局。

*?當(dāng)放置我們的光照探頭時(shí),時(shí)刻記住去檢查最底部的光照探頭,讓它要?jiǎng)倓偤玫仉x開地表一段距離。

在我們的例子場(chǎng)景LightingTutorialOptimal中:我們已經(jīng)創(chuàng)建了兩組光照探頭組。VillageLightProbeGroup比較密集、用于村莊區(qū)域,ExtentsLightProbeGroup比較稀疏、用于村莊外無(wú)法到達(dá)的區(qū)域。這第二組覆蓋了游戲世界的范圍以防止任何非靜態(tài)物體離開可玩區(qū)域。我們?cè)谶@些場(chǎng)景不可到達(dá)的部分不需要有相同的保真度,因此第二組不需要像第一組那么稠密,在垂直的軸向上有兩個(gè)探頭就足夠用了。

將光照探頭組拆分成兩個(gè)GameObject可以使放置探頭更加的容易。為了在場(chǎng)景中工作時(shí)呈現(xiàn)一個(gè)更清晰的視圖,每個(gè)光照探頭組都可以獨(dú)立開啟或關(guān)閉,.些光照探頭在運(yùn)行時(shí)會(huì)自動(dòng)組合并執(zhí)行重疊檢查(de-duplication pass)以刪除所有重疊的探頭。

想看到光照探頭的照明結(jié)果,必須等到預(yù)計(jì)算完成,如果勾選Lighting視圖(Window > Lighting)下的Auto選項(xiàng),就會(huì)自動(dòng)進(jìn)行計(jì)算,如果未勾選,則需要按下旁邊的Build按鈕來(lái)手動(dòng)計(jì)算。

一旦這個(gè)過(guò)程處理完成后,你會(huì)發(fā)現(xiàn)場(chǎng)景里面的非靜態(tài)物體會(huì)開始從光照探頭讀取光照信息,而且看起來(lái)和場(chǎng)景光源會(huì)更匹配。如果要查看照明狀態(tài)下的光照探頭,可以從層級(jí)視圖(Hierarchy)取消選擇光照探頭組。

現(xiàn)在場(chǎng)景里有了光照探頭組,我們就能為場(chǎng)景中的小物體取得間接光照信息,而不需要從PRGI的流程中為這些物體生成額外的光照?qǐng)D表。


下一篇:Unity預(yù)計(jì)算全局實(shí)時(shí)GI(六) - UV展開與減少光照?qǐng)D數(shù)量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容