unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)
* 介紹
Unity中,有兩種GI的技術(shù):烘焙(Baked)和預(yù)計(jì)算實(shí)時(shí)(Precomputed Realtime)全局光照,這篇是講預(yù)計(jì)算實(shí)時(shí)部分的
目錄
- 如何決定光圖分辨率
- 光圖中的Charts是如何影響預(yù)計(jì)算時(shí)間的
- 如何開(kāi)始預(yù)計(jì)算
- 使用光照探針(Light Probes)減小預(yù)計(jì)算時(shí)間
- 預(yù)計(jì)算生成自動(dòng)展UV的優(yōu)化
- 簇(Clusters)是什么以及它們?nèi)绾斡糜谌终彰鞯恼彰?/li>
- 使用Lightmap Parameters來(lái)做物件粒度的光照調(diào)整
(文章說(shuō)通過(guò)優(yōu)化將幾個(gè)小時(shí)的預(yù)計(jì)算時(shí)間縮短到了幾分鐘)
* 實(shí)時(shí)分辨率(Realtime Resolution)
當(dāng)搭建完場(chǎng)景,準(zhǔn)備預(yù)計(jì)算時(shí),第一件要做的事情就是決定光圖的分辨率,它的單位是紋素(texel)/單位(unit),Window>Lighting>Scene設(shè)置目錄是這個(gè)
具體設(shè)置如圖,先在Realtime打上勾,然后修改尺寸** 選擇合適的分辨率
demo場(chǎng)景的比例是1unit=1m,更方便模擬現(xiàn)實(shí)。這個(gè)比例會(huì)影響光圖的細(xì)節(jié),如果比例比較大,比如1unit=5m,或者比例小5unit=1m那么場(chǎng)景物件的精度就會(huì)發(fā)生變化。另一個(gè)影響因素是室內(nèi)和室外,室內(nèi)的物件更多,更精細(xì),而室外或地形則精度要求沒(méi)這么高,所以精度高反而浪費(fèi)了內(nèi)存和計(jì)算開(kāi)銷,下面是一個(gè)1unit=1m比例的參考值
參考值預(yù)計(jì)算需要的實(shí)時(shí)分辨率值比傳統(tǒng)烘焙光圖的低上許多,因?yàn)轭A(yù)計(jì)算只需要捕捉間接光,間接光都是低強(qiáng)度、低頻。在預(yù)計(jì)算時(shí),清晰的陰影都是由實(shí)時(shí)光提供的
傳統(tǒng)烘焙光在1unit=1m的比例下推薦值是30texels/unit,如果用這個(gè)值
** 理解Charts
unity預(yù)計(jì)算中,一個(gè)chart就是物體映射到光圖上對(duì)應(yīng)uv大小的一塊區(qū)域。用于計(jì)算的光照信息儲(chǔ)存在這個(gè)小塊里,信息由輻照(irradiance)和方向(directionality)組成
當(dāng)預(yù)計(jì)算生成后,每一個(gè)紋素的光照信息就被包含在Chart中。所以Chart的大小和數(shù)量是決定預(yù)計(jì)算時(shí)間的重要因素
圖示是一個(gè)4x4紋素大小的Chart,Lightmap UV強(qiáng)制擴(kuò)大了半個(gè)紋素,以防止顏色滲透(Bleeding) https://docs.unity3d.com/Manual/ProgressiveLightmapper-UVOverlap.html?docs.unity3d.com無(wú)論物體有多小,Chart默認(rèn)的最小值是4x4。Unity在圖表邊緣至少需要4個(gè)紋素,以便在找到相應(yīng)的縫合伙伴之前對(duì)其進(jìn)行唯一標(biāo)識(shí)
注意預(yù)計(jì)算不需要padding,因?yàn)閁nity強(qiáng)制在導(dǎo)入Mesh階段給了Chart一個(gè)半紋素的邊界。也就是說(shuō)Chart可以緊挨著彼此并且仍然是雙線性插值而沒(méi)有疊加滲色,從而節(jié)省了寶貴的光照貼圖空間
如果我們有1個(gè)物體,擁有50個(gè)Chart,800個(gè)紋素。所以數(shù)量對(duì)于紋素的增加是個(gè)致命傷,更多的紋素?cái)?shù)量就意味著更多的光照計(jì)算和數(shù)據(jù)壓縮、存儲(chǔ),這大大增加了預(yù)計(jì)算時(shí)間開(kāi)銷。所以減少Charts是縮短預(yù)計(jì)算時(shí)間的重要手段(特別是小物件造成很多自動(dòng)生成的邊界,十分浪費(fèi))
* 開(kāi)始預(yù)計(jì)算過(guò)程
開(kāi)始條件是場(chǎng)景中必須有物體標(biāo)記為L(zhǎng)ightmap Static,物件右上角的Static打上勾,里面有很多的類別。GameObjects的層級(jí)結(jié)構(gòu)可以更快更好的選中和調(diào)整整體類別。demo中的場(chǎng)景部分層次結(jié)構(gòu)
可以對(duì)相同類型的對(duì)象進(jìn)行分組標(biāo)記整個(gè)Environment節(jié)點(diǎn)下所有子節(jié)點(diǎn)都為Static,然后在Lighting Window窗口開(kāi)始預(yù)計(jì)算(快速迭代過(guò)程中建議勾上Auto按鈕)
* 光照探針(Probe Lighting)
減少charts數(shù)量可以減少預(yù)計(jì)算時(shí)間,使用探針就是一種可以去掉部分物件的方式。這些物件會(huì)使用探針來(lái)接收間接光信息。適用的類型是小物件,它們對(duì)場(chǎng)景中的間接光作用不大
** 探針是什么
光照探針是一種用于實(shí)時(shí)渲染中類似光照計(jì)算的快速的技術(shù)。它通常用于在游戲世界中照明角色和其他非靜態(tài)(動(dòng)態(tài))對(duì)象。 探頭照明在運(yùn)行時(shí)非常高效,并且可以快速預(yù)計(jì)算
探針的原理是對(duì)空間中某點(diǎn)的入射光進(jìn)行采樣,并使用球諧(Sphere harmonics)函數(shù)對(duì)此信息進(jìn)行編碼。它的系數(shù)存儲(chǔ)占用很少,并且可以在游戲中快速的解碼用于shader中的近似表面光照的計(jì)算
使用限制
- 是很難在不增加階數(shù)的情況下表現(xiàn)出高頻或者變化頻繁的光照,而增加的代價(jià)又太大了,所以我們只會(huì)使用低階的球諧函數(shù)
- 由于僅有一個(gè)球形表示光照,所以不適合用于大型物體,大型物體上有太多的光照變化
- 球諧編碼不適合大型平面物體或具有明顯凹度的物體
選擇使用探針的物體
最適合物體的特征是小,凸,demo中Environment/Props節(jié)點(diǎn)及其子節(jié)點(diǎn)都是一些小、作為裝飾物的物體,并且數(shù)量很大,對(duì)場(chǎng)景中的間接光作用不大。它們?cè)诠鈭D中作uv展開(kāi)十分的浪費(fèi)邊界,所以全部取消Static選項(xiàng),使用探針來(lái)處理
這么做以后,等預(yù)計(jì)算結(jié)束會(huì)發(fā)現(xiàn)場(chǎng)景中沒(méi)有進(jìn)行預(yù)計(jì)算的非靜態(tài)物體跟場(chǎng)景中的其他物體有很大的區(qū)別,因?yàn)槲覀冞€沒(méi)放上探針,這時(shí)候他們表面只有環(huán)境光(Ambient Probe)。用戶不可見(jiàn),但是會(huì)采樣Lighting Window中設(shè)置的環(huán)境光源
探針的放置
非靜態(tài)物體接收光基于與附近探針的距離。探針直接相互連接組成四面體,物體從哪一個(gè)探針讀取光照信息決定于它落在哪個(gè)四面體中。為了形成四面體,探針?lè)胖脮r(shí)需要注意位置,要包圍住物體
雖然探針在運(yùn)行時(shí)相對(duì)低耗和快速,但出于性能優(yōu)化的考慮,還是有值得注意的地方的。密集網(wǎng)格排布雖然快速,但是很多的探測(cè)器采樣出來(lái)的差異不是很大,很浪費(fèi)。更好的辦法是在光線明顯變化的區(qū)域更大密度的放置探針,比如從光到陰影的過(guò)渡區(qū)域,或者可能存在由光反射形成的強(qiáng)烈色差的區(qū)域
步驟1
- 創(chuàng)建Light Probe Group (GameObject > Light > Light Probe Group)
- 選中新創(chuàng)建的Group,點(diǎn)擊Edit Light Probes
- 留下一個(gè)探針,其他的都刪掉,并把它放在Terrian上方,然后ctrl+D復(fù)制兩份
- 按W移動(dòng),一個(gè)y坐標(biāo)增加2,另一個(gè)增加5
創(chuàng)建一個(gè)垂直排列的原因是我們可以采樣從地面彈射的間接光照,在頭部高度附近以及在空中的光照。當(dāng)我們?cè)趫?chǎng)景周圍復(fù)制這些探針來(lái)創(chuàng)建包圍體的時(shí)候,我們想確保任何位置的物體都會(huì)落在四面體中,探針之間有品紅色的線可以看到
步驟2
- 選中剛剛創(chuàng)建的三個(gè)探針,然后ctrl+D復(fù)制,并移動(dòng)到附近合適的區(qū)域
合適的區(qū)域就是比如陰影區(qū)域,或者有明顯地表材質(zhì)變化的區(qū)域附近。為了保證增加探針而造成的消耗是有價(jià)值的,我們要確保它在采樣一些有明顯光線變化的區(qū)域。我們需要保證包含進(jìn)項(xiàng)目的每一個(gè)項(xiàng)都能有收益
步驟3
- 重復(fù)步驟2,在變化大的區(qū)域以更大密度放置探針,直到創(chuàng)建了一個(gè)稀疏的牢籠布局包含了所有的區(qū)域
- 在擺放探針時(shí),確認(rèn)最靠近地面的是否在地面之上
demo中有兩組探針組,一組用于人口密度大的村莊區(qū)域,另一個(gè)用于村外的稀疏區(qū)域。離開(kāi)第一組區(qū)域后依舊會(huì)被第二組區(qū)域包圍,稀疏區(qū)域不需要跟村內(nèi)相同的密度,垂直方向只需要兩個(gè)即可
拆分探針組更有利于定位探針,可以啟用或者禁用單個(gè)組,用于清晰的調(diào)整。這些組在運(yùn)行時(shí)自動(dòng)合并到一塊兒,并會(huì)刪除重疊的探針
結(jié)束之后再次Lighting Build,現(xiàn)在場(chǎng)景中Props節(jié)點(diǎn)下在場(chǎng)景下看起來(lái)更加和諧了。在場(chǎng)景中不要看見(jiàn)探針,只要不選中探針組就行了。這就是擺放探針來(lái)獲得間接光,并且節(jié)約了很多的光圖Charts和計(jì)算、內(nèi)存的消耗。
最后附上文章鏈接:
https://learn.unity.com/tutorial/precomputed-realtime-gi-global-illumination#5c7f8528edbc2a002053b557?learn.unity.com(其實(shí)翻譯了這么多里面具體怎么算的卻一點(diǎn)沒(méi)看!啊啊啊啊啊啊啊)
總結(jié)
以上是生活随笔為你收集整理的unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c iostream.源码_通达信常用指
- 下一篇: 1200plc 虚拟轴_泡沫轴,哪里酸痛