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