《Unity預(yù)計(jì)算即時(shí)GI》筆記:三、Clusters、光照參數(shù)和總結(jié)

說明

Clusters

叢集,透過修改叢集(Clusters)也是一個(gè)降低Unity預(yù)計(jì)算流程所需要執(zhí)行的工作數(shù)量的好方法。降低叢集數(shù)量也能提高執(zhí)行時(shí)的效能。

當(dāng)採用PRGI來計(jì)算場景光照時(shí),Unity會(huì)簡化產(chǎn)生一個(gè)立體像素化結(jié)構(gòu)的計(jì)算,這些立體像素(Voxel)叫做叢集。叢集實(shí)際上是反映到場景靜態(tài)幾何表面用於照明的表面,叢集用一種層級關(guān)聯(lián)的結(jié)構(gòu)來儲(chǔ)存,用來預(yù)計(jì)算Unity的全域光照漫反射所需要的複雜運(yùn)算。雖然叢集和光照圖很像,但兩者用途是各自獨(dú)立的。

  • 通過設(shè)置CPU Usage即可。

微調(diào)光照參數(shù)

創(chuàng)建

要建立一個(gè)Lightmap Parameters資源,先找到Project視窗,
從Create下拉選單建立(Create > Lightmap Parameters)

我們也可以在Project介面裡按右鍵選(Asset > Create > Lightmap Parameters) 來建立。

使用

從Hierarchy介面選擇你要指定變數(shù)集的物件,物件必須是帶有Mesh Renderer元件的靜態(tài)物件。

開啟Lighting介面(Window > Lighting)並選擇Object頁籤

從Advance Parameters下拉選單指定你的變數(shù)集給物件,右邊的"Edit"按鈕是開啟編輯光照變數(shù)的捷徑。

光照參數(shù)集說明

Resolution

解析度的值確訂了物件採用的光照貼圖解析,這個(gè)值會(huì)和Lighting介面裡的解析度做加乘。比如說,如果場景解析度設(shè)為2,這裡的解析度設(shè)為0.5,那所有帶有這個(gè)參數(shù)集的物件都會(huì)採用1texel/unit來計(jì)算光照貼圖。

Irradiance Budget

image
image

解析度值很大光照貼圖所產(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ì)是光照圖的兩倍大。

imagine our Scene’s global Realtime Resolution was set to 1. We create a cube with a size of 1x1x1 units, and then assign a Lightmap Parameters asset to this object. If our Lightmap Parameters asset specified a Resolution of 1 and a Cluster Resolution of 1, we would have 1 Cluster per side of the cube. If we then increased our Resolution to 2, the result would be 2x(1x1) Clusters per side of the cube, giving 4 Clusters.

將光照貼圖解析和叢集解析度保持指定比例,這樣我們可以和場景整體的解析度建立一個(gè)相對關(guān)係。我們可以把Lighting介面裡面的解析度定義為高解析度作為整體設(shè)定,然後針對個(gè)別物
件微調(diào)各自的光照參數(shù)集。

  • 說白了,數(shù)值越大單位像素上cluster越多,與計(jì)算時(shí)間越長。

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(輻照度範(fàn)圍)用來制訂當(dāng)叢集採樣時(shí)每個(gè)光照貼圖像素所使用到的記憶體量,這會(huì)決定照明結(jié)果的精度,數(shù)值太低代表每個(gè)貼圖像素在記錄時(shí)使用較少記憶體同時(shí)提升CPU效能,代價(jià)就是會(huì)失真,數(shù)值越低光照結(jié)果會(huì)越模糊。反過來看,數(shù)值拉高GI會(huì)更準(zhǔn)確,但記憶體和CPU的消耗都會(huì)提升。

  • 越低效率越高,適合大精細(xì)的模型,很大、模糊或者遙遠(yuǎn)的模型。

Irradiance Quality

當(dāng)計(jì)算PRGI時(shí),每個(gè)光照貼圖像素會(huì)開始對場景投出射線,然後將可視資料報(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ì)忽略掉,這些從背面來的光照資料會(huì)破壞光照結(jié)果,因此調(diào)整這個(gè)值能防止這類情況發(fā)生。


image
image

這裡的地板上的陰影就是Unity在計(jì)算期間從物件無效的背面所創(chuàng)造的,增加Backface Tolerance能改善這個(gè)問題。

Backface Tolerance必須指定從前方光源來的百分比,好讓正面的像素被判定為有效。假如一個(gè)貼圖像素沒通過測試,Unity會(huì)採用鄰近的像素值嘗試算得正確光照資料。

調(diào)整這個(gè)值並不會(huì)影響PRGI運(yùn)算效能,也不會(huì)對預(yù)計(jì)算時(shí)間長度有太大影響。反而是蠻適合在調(diào)整Irradiance Budget都無法解決的場景貼圖太亮或太暗問題時(shí),Backface tolerance會(huì)是一個(gè)不錯(cuò)的除錯(cuò)工具。

  • 調(diào)整這個(gè)值並不會(huì)影響PRGI運(yùn)算效能,也不會(huì)對預(yù)計(jì)算時(shí)間長度有太大影響。2333333333

總結(jié)

學(xué)習(xí)如何評估專案場景並決定適合的光照解析度
了解光照圖,PRGI過程中最耗效能的元素之一,並學(xué)習(xí)如何降低它的數(shù)量。

  • 核心,需掌握。

學(xué)習(xí)如何幫小物件設(shè)定光照探針。

  • 蛋疼的玩意。

學(xué)習(xí)如何調(diào)整Unity的預(yù)計(jì)算參數(shù),讓拆UV過程可以減少光照圖的數(shù)量。
了解甚麼是叢集,如何使用與它對全域光照的影響。

  • 核心,需掌握。

學(xué)習(xí)如何微調(diào)影響場景物件的光照貼圖變數(shù),在不失真的情況下還能提高預(yù)計(jì)算效能。

  • 還是比較有用的,主要還是通過影響cluster。

  • 個(gè)人總結(jié):這個(gè)系列的文章本質(zhì)上是講的如何減少光照圖。通過改變分辨率、優(yōu)化UV展開的結(jié)果等手段來實(shí)現(xiàn)。不過這篇文章如果單純的看有點(diǎn)單薄,建議結(jié)合《Unity 5 中的全局光照技術(shù)詳解!》這篇文章看?;仡^看完在寫筆記。

這個(gè)系列文章中提到的一些有意思的點(diǎn)

  • PRGI只會(huì)呈現(xiàn)場景裡的漫反射(diffuse)和間接照明

  • Unity的拆解演算法會(huì)嘗試把不同Shell做調(diào)整將UV邊緣拼接在一起來簡化UV貼圖

  • 在某些情況下,網(wǎng)格匯入器可能會(huì)拆開幾何圖形。例如,如果有個(gè)網(wǎng)格有非常多的三角面,Unity可以為了效能把它分割成幾個(gè)獨(dú)立的子網(wǎng)格。通常這麼做是為了符合特定硬體需求,例如為了減少每個(gè)Draw Call所需要呼叫的三角面數(shù)量。分割通常會(huì)發(fā)生在相鄰的網(wǎng)格面之間法向角度有大變化的區(qū)域,比如銳角邊(hard edges)。這樣的拆分網(wǎng)格方式會(huì)在模型導(dǎo)入流程時(shí)執(zhí)行,在這個(gè)過程中,UV Shell也可能會(huì)被拆分開來放到不同的光照圖,造成額外的光照圖消耗。

  • 當(dāng)計(jì)算PRGI時(shí),每個(gè)光照貼圖像素會(huì)開始對場景投出射線,然後將可視資料報(bào)告給附近的叢集,然後貼圖像素就會(huì)得到每個(gè)叢集的百分比數(shù)值,這個(gè)值用來定義光照貼圖裡每個(gè)像素從叢集所分到的可視數(shù)據(jù)

  • 當(dāng)計(jì)算PRGI時(shí),每個(gè)光照貼圖像素會(huì)開始對場景投出射線,然後將可視資料報(bào)告給附近的叢集,然後貼圖像素就會(huì)得到每個(gè)叢集的百分比數(shù)值,這個(gè)值用來定義光照貼圖裡每個(gè)像素從叢集所分到的可視數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容