2013年12月6日 星期五

Unity 4.3 關於 Occlusion Culling : 基本篇

原文作者:Kristyna Paskova

Unity 4.3針對遮擋剔除功能(Occlusion Culling)有重大改進,包含把遮擋剔除重製,不是只有把介面簡化也加快了運算的時間和加了一些新功能。

這個介紹總共有三篇文章,會說明新的遮擋剔除如何在Unity 4.3裡面運作,本篇會說明遮擋剔除的基本原理,以及基本的操作介面。後面的兩篇會著重在常見問題和解決方法。


接下來從基本知識的開始,遮擋剔除是用來消除躲在其他物件後面看不到的物件,這代表資源不會浪費在那些看不到的地方進而提升校能。
在Unity裡,遮擋剔除是透過名為Umbra的中介軟體來執行這個工作,你可以從介面的Window->Occlusion Culling找到(在Lightmapping底下)。


Umbra運作方式

Umbra的遮擋剔除過程可以分為兩個階段,在編輯器裡Umbra會即時檢查可以被看到的物件,首先Umbra會採樣遊戲場景並透過烘焙(Bake)將場景紀錄成為一個資料結構,在製作結構的期間,Umbra會先像素化場景,把一區一區的點歸類群組,並把每一區(Cell)合併到傳送區(Portal),再添加一些必要的數據資料就會成為Unity用的遮擋剔除資料。

在執行時,Umbra會從傳送區呼叫並格式化這些資料並放到一個緩衝區,並測試哪些物件可以被看到,Unity這時會給Umbra鏡頭座標,讓Umbra回傳那些物件是可以看到的,這是一個單向檢查,並不會回傳任何False值,另一方面來看,可能會有些物件被判斷是可見的,但或許並非如此。


這個版本看起來和上個版本很像,但是我們基本上是重製了這個系統,不管內在和外在變得更好!


如何使用Umbra

有幾個因素來讓遮擋剔除得到最佳效果,在理想情況下是效能最好,但越高精準度代表取樣的資料越大,取樣資料越大代表遮擋剔除執行效能越低,如果遮擋剔除吃掉了太多的效能,就不要整個場景都使用。另一個角度來看,如果物件太少就不需要為了少少的物件使用遮擋剔除。這是需要平衡考量的。


Umbra給予你一些參數來調整控制取樣資料平衡,調整執行時烘焙過程和資料取樣類型,就像看到的一樣簡單明瞭,如果已經取樣完成並且鏡頭有開啟遮擋剔除設定,那Unity就會自動使用Umbra。

三個設定

關於Smallest Hole
在設定裡面Smallest Hole值控制著輸入的內容,當像素化遮擋的形狀時,Smallest Hole會直接對應像素大小,這代表如果你的幾何圖形有包含一些縫隙或裂縫你想看穿到後面,可以用這個參數來控制。
另一方面,很多的幾何含有裂縫,你不想要看穿的話,也可以給他一個適當的值來修補。它可以在烘焙的時候協助規劃可視範圍。

請注意,這個參數設定的太小的話會讓烘焙時間很久並占用很大的記憶體,甚至會導致記憶體不足而失敗,話說回來,如果設定的太大的話當然會快得多記憶體也省得多,但也有可能會造成像是圍欄中間的洞看不見後面的東西,所以大不一定好,一般情況下,這個參數儘量是在視覺可接受的範圍內越大越好,實際上大部分的遊戲我們建議是5-50cm是玩家可接受的範圍,在Unity裡面預設值是25cm,是不錯的預設值。



關於Smallest Occluder
Smallest hole決定了那些幾何面的顯示,而Smallest Occluder決定產生資料取樣的品質,數值越大執行遮擋剔除的速度越快,但會提高誤判的機率,數值越小結果會越精確,但會耗用較多CPU的資源成本,品質越好的資料取樣也代表越大的資料空間。

這個值越小代表會取樣更細的遮擋剔除資料,這會直接影響Umbra建立取樣區塊的大小。小區塊太多代表區塊之間的傳送區也會變多,自然會消耗大量的資源在建立傳送區上面。反之亦然
改變這個值的影響可以從下面的圖片看出,越大的值細節就越低,速度越快,反之越小的值細節越多,速度越慢。


大多數遊戲裡,僅量讓Smallest occluder產生的區塊比玩家大個幾米,如果你的遊戲規模不是像星空這樣特別大或是非常小,地方保持可以看到2-6米的距離剛剛好,Unity預設值是5米

Backface threshold
這或許是最難掌握的參數,雖然在大部分情況下你並不需要修改它,但可以了解一下會有一些情況它會派上用場。
首先,這個參數存在最重要的目的是"優化遮擋資料的大小",代表如果你的遮擋資料大小是OK的,你可以完全不管這個值
第二,這個值是一個百分比,因此90代表90%

那到底這個值是做甚麼用呢?
想像一個場景包含許多物件,可能也會有一個地形,在這個情況下我們預設鏡頭位置不會跑到地表下或跑進像建築物的物件裡面(通常你的碰撞體會判斷),這些無效的位置也會從裡面看到三角面,因此在大部分情況下,這個值的設定是為了讓遊戲中的鏡頭不會停在這些無效的位置。


backface threshold參數會幫助你處理這樣的工作.設定多少%的背面幾何可以從鏡頭的任何角度被看到,Umbra會把角度以外的背面資料剔除,原理是Umbra從全部的區塊隨機取樣後用射線檢查有多少光線射到背面幾何面,如果超過一定值會把該區塊從遮擋資料中剔除,當值是100代表完全禁用背面測試。

所以,如果你設定這個值為70,代表在區塊裡所有的位置超過70%背面被射線射到的區塊,會被執行"剔除在遮擋資料裡尚未定義的位置",因為相機永遠不會停在那些地方,有些像是地表以下區域由於相機不會在那裏停留,某些情況下會場生相當顯著的資料大小差異。

要強調的是"剔除在遮擋資料裡尚未定義的位置",裡面的"尚未定義"意思是可能是正確或不正確或有錯誤的資料,所有的物件都是簡單的視錐剔除。

當然,在某些情況下,會發生有些背面的幾何面被鏡頭看到,有可能是因為被認定為單面網格或因為錯誤標記為遮擋器,如果物件很大,可能會導致背面測試觸發附近的區域,造成剔除錯誤等等,這就是為什麼Unity預設這個值是關閉的(100)。



你可以隨意調整參數來體驗一下效果如何,試著調成90應該就會放棄了大量的地形,例如地表下,看看他是如何影響遮擋資料大小,甚至可以試著調整更低,如果開始發現畫面不自然再把值調回100看看是否問題得以解決。


待續...
在下一章,我們會介紹一些如何做出最佳遮擋剔除結果的實踐和建議,各位也可以訪問www.umbrasoftware.com來或許更多消息。



Unity 4.3 關於 Occlusion Culling : 第二篇


沒有留言:

張貼留言

著作人