2014年1月10日 星期五

Unity 4.3 關於 Occlusion Culling : 錯誤診斷

這篇文章原文是由Jasin Bushnaie所撰寫,解釋Umbra在Unity 4.3的遮擋剔除(Occlusion culling)的第三篇,本篇說明更深入的遮擋剔除錯誤排除,如果你錯過了前兩篇文章,請見:
第一篇:基本篇
http://unitytaiwan.blogspot.tw/2013/12/unity-43-occlusion-culling.html
第二篇:最佳做法
http://unitytaiwan.blogspot.tw/2013/12/unity-43-occlusion-culling_26.html

本篇是系列的最後一篇文章,第一章我們介紹了Unity 4.3的遮擋剔除功能和一些基本參數,第二章介紹了遮擋剔除的最佳作法建議,本篇將會介紹一些可能發生的常見問題和如何排除。

Visualizations(視覺模擬)
Unity提供了幾個幫你模擬遮擋剔除物件的功能。透過這些功能可以幫你找出為何遮擋剔除沒有如預期的表現,Visualization可以從Occlusion介面上找到。


 你也可以從場景裡面把遮擋剔除裡面的模擬選項打開或關閉

有三個模擬效果接下來我們會一一介紹

Camera Volumes
打開Camera Volumes會顯示灰色方框告訴你現在鏡頭位於哪一區(Cell),關於區的介紹可以看看前面的文章,這個模擬可以讓你找出一個最小的smallest occluder值來輸出遮擋資料,可以讓你檢查區的邊界是否合理,例如下圖所示,當灰色區塊不正常延伸到遮擋牆壁的另外一邊,代表設定有問題。

Visibility Lines

透過這個模擬會用綠線來呈現鏡頭所看到的範圍,原理是Umbra會在場景裡從鏡頭到最遠的遮擋物中間投射出一條條的線檢查可視深度,這個模擬功能可以讓你檢查場景有沒有前一章所描述的縫隙或破面,導致一些應該被遮擋掉的物件變成可見的。同時也可以解決一些設定的問題,例如檢查出哪些物件忘了設定為靜態物件。

Portals

Portal模擬會把區之間的連接口用半透明對齊軸向的四邊形來顯示,可以幫你了解有多少連接口可以穿越,也可以協助調整遮擋剔除優化,它算另外一個方式呈現Umbra的視線正在看見的區域(綠色),所以你可以透過這個方法了解連接口的分佈或檢查場景內沒有產生遮擋剔除效果的地方有哪些。

錯誤診斷
雖然遮擋剔除在Unity運作不會有太大的問題,但有時候還是會有例外,接下來我會介紹一些常發生的問題以及如何解決,使你的遊戲執行更順暢。

隱藏的物件沒被剔除!
有些看起來應該被Umbra剔除的物件卻沒有被剔除,可能有幾個原因,Umbra的運作原理始終是保守的,代表它如果遇到太多不確定性的因素,保留物件是比較保險的。這也適用於所有無法判定結果時的解決方法。

遮擋資料的大小是由Smallest occluder進行控制,數值越大速度越快資料量越小,數值越小產生的資料解析越高,遮擋會更精確,但同時也會失去效能和擴大數據資料。

不該剔除的物件被剔除!
有時候不應該被剔除的物件會被剔除的情況,為什麼呢?一般來說可能有幾個原因,最常見的情況是當你透過一個洞或是空隙或裂縫去看某一個東西,但是Umbra判定沒有洞,所以洞後面的物件被剔除。這種情況你可以先調低smallest hole的值看看是否可以解決問題,如果只是為了測試可以調低一點有效果再調回來。

有些像是一個書架在場景裡,上面的每一本書都被設定為遮擋,如果smallest hole的值設定太大可能會造成書或架子被剔除的錯誤,這裡同理可以調低smallest hole的值試試看。

還有的可能性是在設定backface threshold參數時設定小於100,且鏡頭剛好在單面網格的背面,就算鏡頭沒有對著網格背面,有可能造成看透過去,且對面的物件被剔除。

想要解決這些問題首先當然是試著把backface的限制設回100,看看是否問題解決,如果是,代表只要重新修改模型成為雙面或是固體的模型,或是將有問題的物件靜態遮擋旗標取消就可以解決,如果你不介意遮擋資料太大,把值調成100也是一種選擇。


鏡頭跑入遮擋器,剔除效果很奇怪
如果你的鏡頭非常接近或跑進遮擋器裡面,剔除可能會變得很奇怪。通常會發生在第三人稱視角的遊戲,因為Umbra把遮擋器當成固體,從裡面運算剔除的話通常會把場景大部分的東西都剔除。反過來看,如果backface的值低於100(啟用),遮擋器裡面的座標資料會被完全清除,為了避免造成未知的效果,鏡頭更不應該跑進去。

更具體的來說,一般情況下只要鏡頭和遮擋器的距離大於smallest hole所設定的值,Umbra可以保證產生正確的遮擋剔除效果。就算接近一點也還
OK,但某些情況下因為3D像素化時會影響到遮擋數據的準確性,太接近的話有可能會導致相機的座標可能進入遮擋器。

小技巧:使用Camera volume來模擬哪些區域的鏡頭位置狀態。


如果調整backface threshold參數沒有改善問題,或是你的鏡頭跑進去遮擋器裡面,只能把物件的遮擋器旗標刪除來解決。


剔除太慢!

通常效能不好原因很單純,太多傳送口(Portal)造成查詢可見的物件需要太多時間,而smallest occluder參數是控制傳送口的解析,值越大產生的傳送口解析較低運算較快,但某些情況下會有特例,遮擋資料太簡化時像素化會讓視圖距離錯位增加,造成傳送口也會增加。雖然這不是很常發生的情況,一般來說大一點的smallest occluder值會加速處理時間,但精確度也會降低。

另一種解決方法來讓有問題的場景傳送口數量不要太多的方式是修改場景的模型,讓可視距離(View distance)不要太長,降低傳送口數量讓遮擋剔除速度更快。


烘焙太慢!

烘焙的速度大多取決於一個原因就是有多少像素需要運算。反之,像素的多少取決於場景大小和像素大小,假如你無法決定場景大小,那就用smallest hole參數來調整像素的大小 ,一開始可以用大一點的數值來加快烘焙,然後慢慢往下調整到你的角色在場景裡面都有正確的被剔除為最佳。設定的太小可能會導致烘焙要非常久,並且耗用大量的記憶體。

遮擋數據過大!
如果烘焙後的場景產生出來的遮擋數據太大,可以試試看幾個方法,首先可以改變backface threshold的值從100往下調,例如從99或50甚至30開始,找尋一個所有的遮擋剔除效果都合理的最小值。上一篇介紹也有說明這個方法。

如果更改backface threshold產生的結果不是你要的話,你可以嘗試把smallest occluder往上增加,他會很明顯的影響遮擋數據資料的解析大小,當然同時也會提升像素化的大小。

最後,大場景所產生的數據自然比小的更多,數據的大小會顯示在遮擋介面底下。

出現Failure in split phase錯誤
罕見的情況下,浩大的場景但設定了很小的smallest occluder參數,烘焙過程中可能會出現"Failure in split phase"錯誤訊息,這是因為烘焙遮擋數據的第一步是把場景細分像磁磚一樣一塊一塊的,由於這個步驟會參考smallest occluder的參數來產生,所以當場景非常大的時候會導致有太多細分的磁磚被產生,耗光你的記憶體。所以遇到這種情況必須把smallest occluder的值調高或是把場景分成更小塊來解決這個問題。

這一系列的文章到此結束,希望可以讓對於遮擋剔除有興趣的開發者了解更多原理,更多的資訊也可以參考Unity或Umbra官網。




Unity 目前已經到4.3版,是最好的2D,3D專案製作方案,想知道更多訊息請上官方網站:
www.unity3d.com

沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊