Unity预计算全局实时GI(gi params)
Unity提供許多進(jìn)階的光照貼圖控制方法,這些設(shè)定被放在一個(gè)光照參數(shù)集(LightmapParameters)的資源里,好讓設(shè)定能在不同的項(xiàng)目場景或是透過版本控制和團(tuán)隊(duì)一起共享。
- ??要建立一個(gè)Lightmap Parameters資源,先找到Project窗口
- 從Create下拉選單建立(Create> Lightmap Parameters)
- 我們也可以在Project接口里右鍵單擊選(Asset> Create > Lightmap Parameters)?來建立。
?
?
透過這個(gè)參數(shù)集可以針對烘焙光照或預(yù)計(jì)算GI做更高階的設(shè)定
?
建立完成的光照參數(shù)集可以被指定給靜態(tài)對象。
- 從Hierarchy接口選擇你要指定變量集的對象,對象必須是帶有Mesh Renderer組件的靜態(tài)對象。
- 開啟Lighting接口(Window> Lighting)并選擇Object頁簽
- ?從Advance Parameters下拉選單指定你的變量集給對象,右邊的"Edit"按鈕是開啟編輯光照變量的快捷方式。
?
?
從Lighting接口里的AdvancedParameters字段指定光照參數(shù)集
同一個(gè)光照參數(shù)集可以指定個(gè)許多不同的對象,你只要從Hierarchy接口一次把要指定的對象全選起來,執(zhí)行上面說明的步驟把檔案指定到Advanced Parameters字段即可。
光照參數(shù)集:實(shí)例(per-instance)還是預(yù)制(per-Prefab)好?
和拆UV的部分很像,光照參數(shù)集可以指定給Prefab預(yù)制對象或給場景里的獨(dú)立對象,一旦參數(shù)集被貼上對象就會(huì)覆蓋掉對象身上舊有的設(shè)定。
這個(gè)方法的好處是你可以把正常情況下會(huì)用到的光照設(shè)定貼在預(yù)制對象上,然后依照不同需求修改覆蓋場景里實(shí)例對象身上的光照參數(shù)設(shè)定。
本教學(xué)里,我們會(huì)從一個(gè)實(shí)例對象身上示范如何使用光照參數(shù)集,主要是因?yàn)槲覀兿敫鶕?jù)使用的對象來選擇不同的光照參數(shù)集。
預(yù)設(shè)參數(shù)集
這部分適合用來設(shè)定場景預(yù)設(shè)的光照參數(shù),這個(gè)參數(shù)集待會(huì)會(huì)被指定給所有場景里面帶有Mesh Renderer組件但卻還沒指定Lightmap Parameters的對象。場景里建立的任何帶有Mesh Renderer的對象都會(huì)以此為基礎(chǔ),這樣可以省下手動(dòng)指定的時(shí)間。
- 開啟Lighting接口(Window> Lighting)并選擇Scene頁簽
- 從General GI區(qū)塊里找到DefaultParameter,選擇你剛才建立的光照參數(shù)集。
雖然新的對象會(huì)開始采用這個(gè)預(yù)設(shè)設(shè)定值,你仍然可以從Advanced Parameter參數(shù)單讀覆蓋它。
?
默認(rèn)的設(shè)定會(huì)反映到所有新的靜態(tài)對象
Unity預(yù)設(shè)有幾組光照參數(shù)集可以選,分別是:
- Default - HighResolution
- Default - Medium
- Default - LowResolution
- Default - VeryLowResolution
這幾個(gè)不同的設(shè)定存有會(huì)影響到光照結(jié)果的設(shè)定像是光照貼圖分辨率,光照圖大小以及其他一些進(jìn)階選項(xiàng)設(shè)定,可以用來快速調(diào)整總體結(jié)果。
光照參數(shù)集說明
Unity默認(rèn)的參數(shù)組合事實(shí)上已經(jīng)很適合大多數(shù)的情況,但我們還可以建立自己的參數(shù)組并做更多的微調(diào),來讓GI計(jì)算達(dá)到比預(yù)期更好的結(jié)果。
Unity手冊上關(guān)于光照參數(shù)集有個(gè)別的詳盡說明,但針對這個(gè)教學(xué)我們也會(huì)重點(diǎn)說明幾個(gè)最有用的設(shè)定。
Resolution
分辨率的值確訂了對象采用的光照貼圖解析,這個(gè)值會(huì)和Lighting接口里的分辨率做加乘。比如說,如果場景分辨率設(shè)為2,這里的分辨率設(shè)為0.5,那所有帶有這個(gè)參數(shù)集的對象都會(huì)采用1texel/unit來計(jì)算光照貼圖。
由于PRGI只會(huì)呈現(xiàn)場景里的漫反射(diffuse)和間接照明,所以我們不需要用到像傳統(tǒng)烘焙貼圖那么高(20-30)的采樣值,通常設(shè)定2-3已經(jīng)很好了。如果是戶外場景,甚至可以縮小很多倍像是0.1就足以提供足夠的細(xì)節(jié)。
?
分辨率值很大光照貼圖所產(chǎn)生的影子斑點(diǎn)可以把Irradiance Budget這個(gè)參數(shù)調(diào)高來獲得緩解。
注意,當(dāng)分辨率值很大時(shí),在較低分辨率下可能會(huì)產(chǎn)生奇怪的陰影,這些陰影在最終的光照貼圖里可能看起來像是斑點(diǎn)或臟污。如果有這種情況可以試著把Irradiance Budget參數(shù)提高來獲得改善。
Cluster Resolution
叢集分辨率用來決定1個(gè)像素里能有多少叢集數(shù)量。假如這個(gè)值設(shè)為1,代表光照圖里面每個(gè)像素都都會(huì)有一個(gè)叢集,0.5代表一個(gè)像素會(huì)有2個(gè)叢集,換句話說叢集會(huì)是光照圖的兩倍大。
進(jìn)一步來說,可以想象如果我們把場景的分辨率設(shè)為1,并建立一個(gè)1x1x1的方塊,然后指定這個(gè)光照參數(shù)集給對象,那么方塊的每一面都會(huì)有1個(gè)叢集。如果我們把分辨率改為2,結(jié)果就會(huì)變成2(1x1),方塊的每一面叢集會(huì)變成4個(gè)。
?
上圖可以看到一個(gè)分辨率設(shè)為1的1x1x1方塊,光照參數(shù)設(shè)定叢集分辨率(Cluster Resolution)為1和光照貼圖分辨率為2時(shí),我們每一面都會(huì)有4個(gè)叢集。
在大多數(shù)的情況下,Cluster Resolution只需要設(shè)為低于貼圖像素(lightmap texels)大小即可,例如Default -HighResolution設(shè)定值為0.6。
一個(gè)場景中叢集太多的話會(huì)很快拉高預(yù)計(jì)算時(shí)間,還會(huì)影響到實(shí)時(shí)場景的光照效能,因此必須要把叢集的數(shù)量花在刀口上,永遠(yuǎn)以保持質(zhì)量盡可能的降低叢集數(shù)量為目標(biāo)。
將光照貼圖解析和叢集分辨率保持指定比例,這樣我們可以和場景整體的分辨率建立一個(gè)相對關(guān)系。我們可以把Lighting接口里面的分辨率定義為高分辨率作為整體設(shè)定,然后針對個(gè)別對象微調(diào)各自的光照參數(shù)集。
Unity采用這種分層法方便讓開發(fā)者能更全觀的控制場景光照,不然要針對每個(gè)對象手動(dòng)都設(shè)定光照參數(shù)的值會(huì)很麻煩。
Irradiance Budget
我們之前說明過光照計(jì)算是如何用叢集來計(jì)算靜態(tài)對象的預(yù)計(jì)算光照,在預(yù)計(jì)算的過程里,叢集之間的關(guān)系被建立起來,好讓光線得以在叢集網(wǎng)內(nèi)快速傳遞。
在本質(zhì)上,光照貼圖像素值的算法是基于叢集從該像素的位置對場景的一個(gè)檢視所計(jì)算得來,這會(huì)讓我們可以很快計(jì)算叢集之間的光照反射最后產(chǎn)生一個(gè)全局光照,這些叢集就能在畫面渲染完之前給予適當(dāng)?shù)臉颖緮?shù)。
Irradiance Budget(輻照度范圍)用來制訂當(dāng)叢集采樣時(shí)每個(gè)光照貼圖像素所使用到的內(nèi)存量,這會(huì)決定照明結(jié)果的精度,數(shù)值太低代表每個(gè)貼圖像素在記錄時(shí)使用較少內(nèi)存同時(shí)提升CPU效能,代價(jià)就是會(huì)失真,數(shù)值越低光照結(jié)果會(huì)越模糊。反過來看,數(shù)值拉高GI會(huì)更準(zhǔn)確,但內(nèi)存和CPU的消耗都會(huì)提升。
如果我們的預(yù)計(jì)算在Runtime執(zhí)行時(shí)更新有點(diǎn)慢或會(huì)lag,可能降低這個(gè)值會(huì)得到改善,這個(gè)設(shè)定比較適合用在不用精細(xì)的對象,很大、模糊或遙遠(yuǎn)的物件。
Irradiance Quality
當(dāng)計(jì)算PRGI時(shí),每個(gè)光照貼圖像素會(huì)開始對場景投出射線,然后將可視數(shù)據(jù)報(bào)告給附近的叢集,然后貼圖像素就會(huì)得到每個(gè)叢集的百分比數(shù)值,這個(gè)值用來定義光照貼圖里每個(gè)像素從叢集所分到的可視數(shù)據(jù),而一欄設(shè)定就是用來設(shè)定每個(gè)像素能對場景投射多少射線。
如果場景里的對象和周圍對象光照不合的情況下可以斟酌加大這個(gè)值,有時(shí)該暗的時(shí)候光照結(jié)果卻意想不到的亮,有可能是因?yàn)橥渡涞綀鼍暗纳渚€不足或遮擋到,導(dǎo)致漏算叢集資料。同樣該亮的的放如果射線沒有檢查到,可能會(huì)造成過暗。
提高射線的投射量就能解決類似的問題,代價(jià)就是增加預(yù)計(jì)算的時(shí)間,要優(yōu)化這個(gè)時(shí)間,我們應(yīng)該找出最適合的值來達(dá)到我們理想的照明效果。請注意,這個(gè)值不會(huì)影響到Runtime時(shí)的效能。
Backface Tolerance
當(dāng)射線從光照貼圖像素投射出,從場景叢集搜集光線時(shí)有時(shí)會(huì)打到幾何的背面,當(dāng)計(jì)算全局光照時(shí)我們只需要關(guān)心投射到物體表面的光照,從背面來的光照資源通常都會(huì)忽略掉,這些從背面來的光照數(shù)據(jù)會(huì)破壞光照結(jié)果,因此調(diào)整這個(gè)值能防止這類情況發(fā)生。
?
這里的地板上的陰影就是Unity在計(jì)算期間從對象無效的背面所創(chuàng)造的,增加Backface Tolerance能改善這個(gè)問題。
Backface Tolerance必須指定從前方光源來的百分比,好讓正面的像素被判定為有效。假如一個(gè)貼圖像素沒通過測試,Unity會(huì)采用鄰近的像素值嘗試算得正確光照數(shù)據(jù)。
調(diào)整這個(gè)值并不會(huì)影響PRGI運(yùn)算效能,也不會(huì)對預(yù)計(jì)算時(shí)間長度有太大影響。反而是蠻適合在調(diào)整Irradiance Budget都無法解決的場景貼圖太亮或太暗問題時(shí),Backfacetolerance會(huì)是一個(gè)不錯(cuò)的除錯(cuò)工具。
Modelling Tolerance
有時(shí)候在場景靜態(tài)對象中存在小間隙的區(qū)域會(huì)產(chǎn)生黑色的光暈或是不需要?dú)埾?#xff0c;很容易發(fā)生在鄰近有相反幾何圖形的區(qū)域,像是地板上的對象:
?
像這樣物品的黑暗邊緣通常可以透過加大Modelling Tolerance來改善
通常在這樣的情況下,物體和物體之間存在著小小的縫隙,因?yàn)闆]有太多光線可以進(jìn)入,導(dǎo)致非常暗的光照圖產(chǎn)生。當(dāng)光照分辨率低的時(shí)候,這些黑暗像素的大小可能會(huì)導(dǎo)致它們跑出遮擋物的邊界并產(chǎn)生不協(xié)調(diào)的黑色塊。
Modelling Tolerance是用來忽略比Threshold值還小的細(xì)節(jié),提高這個(gè)值可以確保Unity?在計(jì)算GI時(shí)忽略掉非常靠近其他物體表面的幾何面,這個(gè)值越高代表Light Transport這個(gè)階段需要額外計(jì)算忽略這些間隙,調(diào)低ModellingTolerance也能確保小對象不會(huì)被遺漏計(jì)算。
Modelling Tolerance不會(huì)影響PRGI的優(yōu)化,對于計(jì)算時(shí)間和執(zhí)行效能也沒甚么負(fù)面影響,它能用在一些除錯(cuò)流程上,解決連Irradiance Budget都無法改善的殘影問題。
開始建立Lightmap Parameters光照參數(shù)資源
現(xiàn)在我們已經(jīng)明白光照參數(shù)能做甚么了,可以開始嘗試建立這些資源。
- 打開LightingTutorialStart場景
- 在Project窗口找到Assets >LightmapParameters目錄并點(diǎn)進(jìn)去
- 從Project窗口最上面的下拉選單建立一個(gè)光照參數(shù)集(Create > Lightmap Parameters
- 把對象名稱改為"TutorialTerrainLow"
?
這個(gè)對象從鏡頭看起來非常大,蠻適合設(shè)一個(gè)光照參數(shù)集而不是用場景預(yù)設(shè)的
接下來我們要把剛剛新建的光照參數(shù)集指定給這個(gè)對象
- 在場景窗口里,選擇最接近主場景的兩座山,這些山都已經(jīng)被命名為"MountainPeak"。注意,我們將忽略最遠(yuǎn)的山。
- 從Inspector接口確認(rèn)兩個(gè)對象都是設(shè)定為靜態(tài)對象
- 開啟Lighting窗口(Window> Lighting)?并選擇Scene頁簽
- 確保最底下的Auto是打勾
- 改選擇Object頁簽
- 從Advanced Parameters下拉選單選擇剛建立的TutorialTerrainLow
- 單擊右邊的Edit按鈕,準(zhǔn)備開始調(diào)整設(shè)定
?
預(yù)設(shè)的光照參數(shù)集
首先我們要看的是Resolution,降低這個(gè)值可以加速預(yù)計(jì)算時(shí)間同時(shí)也提升執(zhí)行效能,所以我們應(yīng)該目標(biāo)定在不影響畫質(zhì)的前提下采用較低的分辨率。
會(huì)很接近看的對象可以設(shè)比較高的值,但是兩座山距離鏡頭都非常遠(yuǎn),因此這個(gè)例子設(shè)低一點(diǎn)是比較好的。這些大對象表面材質(zhì)相當(dāng)一致,從鏡頭的角度來看,接收到光的顏色變化也不大,所以可以降低這個(gè)值而不會(huì)影響結(jié)果質(zhì)量。
?
像是山或地形的大場景,采用默認(rèn)值反而很浪費(fèi)
?
使用較低的分辨率犧牲質(zhì)量但可以大大節(jié)省預(yù)計(jì)算和執(zhí)行效能
- 慢慢的降低TutorialTerrainLow光照參數(shù)集里面的Resolution參數(shù)并觀察結(jié)果的變化。
請記得這里的分辨率和Lighting窗口里的場景分辨率是會(huì)相乘的,目前場景分辨率是1,代表如果這里的分辨率小于1的話,輸出的光照貼圖每unit也會(huì)小于1像素(texel)
兩座山和其他的對象距離非常遠(yuǎn),它們不可能接受頻率很高的光照,因此如果我們采用較低的分辨率損失的質(zhì)量不會(huì)太多。教學(xué)里我們發(fā)現(xiàn)用0.05就足以采樣該有的光照數(shù)據(jù)。
- 從Project窗口點(diǎn)選TutorialTerrainLow對象
- 從Inspector界面把Resolution設(shè)為0.05
然后來看看Cluster Resolution的值,之前討論過,這個(gè)值也是一個(gè)用來和光照貼圖像素?cái)?shù)量相乘計(jì)算叢集的乘法器,當(dāng)數(shù)值是1的時(shí)候叢集的數(shù)量就等于光照貼圖像素的數(shù)量,因此低于1會(huì)比較好。叢集本質(zhì)上是為了計(jì)算PRGI所產(chǎn)生類似靜態(tài)場景的仿真體,所以只有在數(shù)量不足以反映物體的光照反射時(shí)才需要加大這個(gè)值。
和光照貼圖解析很像,這兩座山的叢集分辨率可以設(shè)很低,如果把它設(shè)的跟其他小場景一樣的話,代表可能會(huì)需要幾百個(gè)小場景的叢集量來覆蓋這兩座山。
?
- 對于很大的對象,叢集分辨率可以設(shè)很低
- 把Scene窗口左上方的繪制模式改為Clustering
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 從Inspector界面里把ClusterResolution的值慢慢降低,彩色色塊會(huì)慢慢變大,數(shù)量會(huì)慢慢變少
或是改用Lit Clustering繪制模式來評估設(shè)定的分辨率是否足以采樣場景細(xì)節(jié)的光照。
- 把Scene窗口左上方的繪制模式改為LitClustering
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 從Inspector接口里把ClusterResolution的值慢慢降低,觀察場景的變化。
?
調(diào)整到這里時(shí),可以問問自己是否能接受更低的叢集數(shù)值,如果繼續(xù)調(diào)高對畫質(zhì)已經(jīng)沒有好處了,那就應(yīng)該要往下修正。請記住叢集數(shù)量對于預(yù)計(jì)算的時(shí)間和GI有很大的影響,這個(gè)案例我們發(fā)現(xiàn)用0.4是很適合的值。
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 設(shè)定Cluster Resolution為0.4
?
?
?
LitClustering繪制模式可以用來評估場景里是否有足夠的叢集
需多情況下只是單單降低光照和叢集的分辨率就足夠提升很大的效能,但是我們還能用IrradianceBudget和Irradiance Quality做更進(jìn)一步的改進(jìn).
首先我們先看看Irradiance Budget,如之前所提,這個(gè)值控制貼圖像素會(huì)占用多少內(nèi)存計(jì)算,為了執(zhí)行時(shí)的效能,我們應(yīng)該使用最低的值以免產(chǎn)生負(fù)面的影響。
如果預(yù)計(jì)算的結(jié)果模糊不清的話可以試著調(diào)大這個(gè)值,對于場景里有著高對比度度卻沒有被精確表達(dá)出來的區(qū)域是很有用的。
?
Irradiance場景繪制模式可以用來評估調(diào)整Irradiance Budget或Quality的值
兩座山照明的頻率沒有很高,也沒有任何高對比度的光照處理,代表在不影響質(zhì)量的情況下,默認(rèn)值128還能再低。
- 把Scene窗口左上方的繪制模式改為Irradiance
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 從Inspector界面里把IrradianceBudget的值慢慢降低
- 你會(huì)看到當(dāng)我們減少這里的值時(shí),兩座山上的照明會(huì)變得柔和一點(diǎn)
經(jīng)過一些實(shí)驗(yàn)之后,我們發(fā)現(xiàn)將Irradiance Budget設(shè)定為64最好
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 從Inspector界面里把IrradianceBudget的值設(shè)為64
現(xiàn)在來看看另外一個(gè)Irradiance Quality,像之前所說的,Irradiance Quality影響著當(dāng)計(jì)算光照像速時(shí)從叢集所投射出來的射線數(shù)量,不像Irradiance Budget只會(huì)影響到預(yù)計(jì)算時(shí)間,這個(gè)設(shè)定會(huì)影響到Runtime執(zhí)行效能。
我們的兩座山是非常大的對象,代表不太容易錯(cuò)過鄰近的叢集,因此我們可以透過降低IrradianceQuality來提升預(yù)計(jì)算的效能。
- 把Scene窗口左上方的繪制模式改為Irradiance
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 從Inspector界面里把IrradianceQuality的值慢慢降低
- 隨著值的下降,產(chǎn)生的光照貼圖變得越來越模糊
我們發(fā)現(xiàn)2048是一個(gè)既可保持我們要的質(zhì)量又能提升計(jì)算效能的平衡點(diǎn),雖然準(zhǔn)確對度會(huì)有點(diǎn)損失,但整體來看是利多于弊的。
- 從Project窗口選擇TutorialTerrainLow光照參數(shù)集
- 從Inspector界面里把IrradianceQuality的值設(shè)為2048
?
把設(shè)定好的光照參數(shù)集指定給場景其他對象
現(xiàn)在我們可以幫LightingTutorialStart場景里剩余的靜態(tài)對象建立并指定光照參數(shù)集。
我們之前討論如果決定一個(gè)分類方法。基于特征(例如大小或是距離鏡頭的距離)將場景對象分組,以方便我們能更容易為對象指定光照參數(shù)集。
當(dāng)我們在處理Environment對象底下其余的子對象時(shí),請盡量幫能共享光照參數(shù)集的對象分同一類,例如:對象是否會(huì)很接近??這樣如果提高該對象的分辨率對于結(jié)果會(huì)明顯的改善,如果是很遠(yuǎn)的對象你就不需要相同的設(shè)定值,如果物體材料無法反映材質(zhì)的大量變化,高分辨率就沒甚么好處。
分組不需要太細(xì),對于大多數(shù)情況下,幾組差異性大的設(shè)定就夠了,分太細(xì)也不好管理,可能每個(gè)細(xì)節(jié)都要針對對象獨(dú)立修改。
在我們完成的場景LightingTutorialOptimal里面,我們分組依據(jù)如下:
- RockLow:距離鏡頭有段距離的光滑石頭,因?yàn)榫嚯x遠(yuǎn)所以分辨率低。
- RockMedium:光滑石頭,更接進(jìn)玩家區(qū)域,所以需要高一點(diǎn)分辨率和設(shè)定。
- StructuresHigh:需要高分辨率呈現(xiàn)的重要的建筑物,同時(shí)也需要更高的IrradianceBudget和Quality設(shè)定。
- StructuresLow:遠(yuǎn)距離的建筑物,只需要低分辨率設(shè)定。
- TerrainLow:大,遙遠(yuǎn)的網(wǎng)格,比如山
- TerrainPlayable:會(huì)很靠近鏡頭的大型地形,需要一個(gè)光照貼圖分辨率來平衡,大的地形把叢集數(shù)量降低也還是很合理
- TerrainVeryLow:非常遙遠(yuǎn)和假的仿真地形,低分辨率和低叢集數(shù)量,IrradianceBudget和Quality也都很低
除了這些自定義參數(shù)之外,在完成的教學(xué)LightingTutorialOptimal里面,我們還放了一些使用預(yù)設(shè)光照參數(shù)的結(jié)構(gòu),這里我們用默認(rèn)的Default-Medium。
使用場景中大多數(shù)靜態(tài)對象默認(rèn)的參數(shù)集可以減少很多手動(dòng)的工作,將常用值指定為預(yù)設(shè)參數(shù)設(shè)定很有幫助,對于我們的目的,Default-Medium和默認(rèn)1像素的分辨率搭配使用很適合。
?
Irradiance繪制模式用來評估場景照明非常有用,因?yàn)樗粫?huì)顯示對PRGI有貢獻(xiàn)的靜態(tài)對象光照結(jié)果。
當(dāng)要決定你的光照設(shè)定決策時(shí),可以用LightingTutorialOptimal來當(dāng)作一個(gè)評估基礎(chǔ),將光照參數(shù)集指定給場景的對象不會(huì)花你太久的時(shí)間。記住,當(dāng)你設(shè)定這些對象時(shí),要不斷的思考調(diào)高參數(shù)值所帶來的好處有多少,如果調(diào)低帶來的負(fù)面影響不多,那不管如何都是首選。
轉(zhuǎn)載于:https://www.cnblogs.com/guaishoudashu/p/10059079.html
總結(jié)
以上是生活随笔為你收集整理的Unity预计算全局实时GI(gi params)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hbuilder:实现阴影透明背景特效
- 下一篇: 消防工程师 10.2 火灾自动报警系统-