Occlusion Culling遮擋剔除理解設置和地形優化應用


這里使用的是unity5.5版本

具體解釋網上都有,就不多說了,這里主要說明怎么使用,以及參數設置和實際注意點

在大場景地形的優化上,但也不是隨便烘焙就能降低幀率的,必須結合實際情況來考慮,當然還有透明物體問題和動態物體的剔除等等都將詳細說明。

 

首先說一下烘焙的關系

因為unity攝像機自帶視椎剔除(Frustum Culling),所以如果都是動態物體,那么只有視椎剔除,可以在bake過后通過camera的occlusion culling里面的visualize看出,其實不baked話也是有的,但是不能通過這樣查看而已。

 

如果需要剔除動態物體,需要使用Occlusion Area,但是動態物體不是放進去烘焙了就能剔除的,這里能剔除動態物體是指存在靜態遮擋物(occluder static)的情況下,可以把在Occlusion Area范圍內運動被靜態遮擋物遮擋的動態物體,如果沒有靜態遮擋物,進行還是簡單的視椎剔除。

一個普通物體可以設置這里兩個狀態(地形不能),第一個occluder static是遮擋物,只會遮擋其他物體,而不會被遮擋,主要大物體這么設置,第二個occludee static是被遮擋物體,小型物體可以設置成這個,不明確或者大小適中的物體可以都勾選上,如果有透明物體等等特殊材質的那就都不勾,防止錯誤剔除。

 

Occlusion Area創建很簡單,注意開始創建的時候是方的,不能旋轉,最好用組件自帶參數調節位置和范圍,最好調節得正好包住動態物體運動的最大范圍(就是不會超出去),Is View Volume是否剔除它內部的動態物體(最好勾上,除非你的動態物體剔除過多了影響投影視覺之類)

 

另外Occlusion Area包裹盒嵌套或者交錯沒有影響,但攝像機在這個區域內將進行遮擋剔除,在這個區域外只進行視椎剔除。所以如果是多個房間這種,最好一個個area之間是有些重疊交錯的覆蓋整個房間。

 

默認沒有設置Occlusion Area是烘焙整個場景的,如果有些區域根本就沒必要或者很少看到,那么用這個包住你需要的區域,可以減少烘焙時間,也能降低cpu占用。

 

這個也可以在地形上進行設置,可以從網格分布上看出,默認地形上如果沒有Occlusion Area,那么這個地形密度差不多,如果地形中間有個Occlusion Area,那么周圍就會很稀疏,而里面密度高。官方參考https://docs.unity3d.com/Manual/class-OcclusionArea.html

 

用scene或者visualization里面設置來可視化剔除區域

可以看到平時看不到的視椎剔除效果,點攝像機並且還要切換到visualize才能看到遮擋物剔除后的效果,參數可以自己試試,不多說了

 

注意力雖然地形可以使用這個優化,但不是能百分百的提高效率的,如果地形大山很多,而且物件很多,常常遮擋后面的效果,這個是可以提高效率的,如果是俯視視角,所有地形幾乎可見,那么效率提升很少有時候設置反而降低,因為剔除是需要cpu參與的,所以這需要實際項目測試。注意了不同場景文件中同一個地形需要再次烘焙,因為地形一樣不代表着地形上的其他東西一樣嘛。

(沒錯這是一整塊地形剔除后的效果)

 

下面是動態物體在Occlusion Area內的剔除測試

下面的灰色帶洞牆沒有設置成occluter static(場景物件和攝像機都在Occlusion Area內部)

 

可以看到只有邊緣的視椎剔除

 

下面的灰色帶洞牆設置成occluter static(場景物件和攝像機都在Occlusion Area內部)

可以看到洞里可以看到的地方也剔除了

 

然后說一下主要剔除參數設置面板

 

最上面按鈕還原默認設置

 

Smallest Occluder越小越精確,但是會烘焙更慢,而且會消耗cpu,這個值最好不要比自己在場景里的最小物體小太多(這里的單位和世界單位一致,比如一個默認方塊長為1),否則會浪費時間,但如果這個值大量就容易出現剔除錯誤,比如多剔除了可見的東西,而沒剔除應該剔除的。如果不想消耗過多cpu,那就要更好地設置遮擋物體和被遮擋物體,不要兩個都勾上。

 

Smallest Hole越小越精確,但是會烘焙更慢,是控制比如牆上的洞在多大的時候需要進行遮擋物剔除,如果數值太大,牆上的裂縫又比較小的情況下,就不會進行遮擋剔除,也就是說裂縫后即使看不到依然會被渲染。

 

backface threshold 用來優化剔除設置本身,這個值最好用默認100,就是不優化,因為如果你的場景物體大小差異很大,可能會剔除錯誤。這個主要是把背面的物體剔除,當然也不是想象的那么簡單,他不可能把組合好模型背后的面剔除,也不是剔除一個物體背后的一個物體,那樣功能不就重復了嗎,它更像是把很里面或者很底下的物體剔除,如果這個值設置成最小的5,最多剔除的物體應該是物體里面的物體(攝像機在最外面的時候),或者是地形下面的物體,當然如果你有透明嵌套物體,最好還是把這個改成100。

 

還有一個相關的組件Occlusion Portal 遮蔽通道

這個可以通過在運行狀態切換是否可以通過,即是否遮蔽,這種剔除准確,但是耗cpu

具體沒怎么試過

 

 

文件

在工程里會出現OcclusionCullingData文件,然后會增加Library目錄的大小,其實你進去就會發現烘焙的結果都是放在Library里的Occlusion文件夾的。

 

OcclusionCullingData解釋如下

PVS (Potentially Visible Set)潛在可見集,打開會unity會卡住爆表的,看了也沒啥用

Scenes不同場景的烘焙結果,一個場景里有兩個場景就會是2

Static renderers靜態物體

Portals通道數量就是上面說的遮蔽通道

 

代碼控制方面

 

void OnBecameVisible()

void OnBecameInvisible()

Renderer.isVisible

具體可以參考這里

http://blog.csdn.net/cartzhang/article/details/52684127

關於剔除影響不影響事件問題

https://forum.unity3d.com/threads/is-culling-killing-performance.183679/

 

最后總結

攝像機要在Occlusion Area內才能遮擋物剔除(當然不創建Occlusion Area的話默認整個場景),否則只有自帶的視椎剔除,另外地形烘焙會略微增加運行時cpu消耗和發布文件大小。記得物體的靜態設置,物體的大小對遮擋很有影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM