1. 程式人生 > >Occlusion Culling遮擋剔除理解設定和地形優化應用

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消耗和釋出檔案大小。記得物體的靜態設定,物體的大小對遮擋很有影響。


相關推薦

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

這裡使用的是unity5.5版本 具體解釋網上都有,就不多說了,這裡主要說明怎麼使用,以及引數設定和實際注意點 在大場景地形的優化上,但也不是隨便烘焙就能降低幀率的,必須結合實際情況來考慮,當然還有透明物體問題和動態物體的剔除等等都將詳細說明。   首先說一下烘焙的關係 因

unity GPU優化(Occlusion Culling遮擋剔除,LOD多細節層次,GI(Global Illumination)全域性光照)

渲染管線: 定義:圖形資料在CPU上經過運算處理,最後輸出到螢幕的過程  1. 頂點處理:接收模型頂點資料、座標系轉換 2. 圖元裝配:組裝面、連線相鄰的頂點,繪製為三角面 3. 光柵化:計算三角面上的畫素,併為後面著色階段提供合理的插值引數(以及深度值) 4. 畫素處

小師妹學JVM之:深入理解JIT編譯優化-你看不懂系列

[toc] # 簡介 小師妹已經學完JVM的簡單部分了,接下來要進入的是JVM中比較晦澀難懂的概念,這些概念是那麼的枯燥乏味,甚至還有點惹人討厭,但是要想深入理解JVM,這些概念是必須的,我將會盡量嘗試用簡單的例子來解釋它們,但一定會有人看不懂,沒關係,這個系列本不是給所有人看的。 更多精彩內容且看:

unity 效能優化遮擋剔除Occlusion Culling) 官方版

遮擋剔除 (Occlusion Culling) 功能可在物件因被其他物體遮擋,當前在相機中無法看到時,禁用物件渲染。該功能不會在三維計算機圖形中自動開啟,因為在大部分情況下,離相機最遠的物件最先渲染,離相機近的物件覆蓋先前的物體(該步驟稱之為“重複渲染 (overdraw)

遮擋剔除Occlusion Culling)與視錐體剔除(Frustum Culling)是否可以同時起作用?()

可以的 Occlusion Culling is a feature that disables rendering of objects when they are not currently seen by the camera because they are

遮擋剔除(僅專業版) Occlusion Culling (Pro only)

Occlusion Culling is a feature that disables rendering of objects when they are not currently seen by the camera because they are obscur

Unity3D-遊戲場景優化遮擋剔除Occlusion Culling)的使用

在大型3D遊戲場景中,如何優化遊戲效能是非常重要的一步。一般遮擋剔除是非常常用的。接下來我們看看如何使用遮擋剔除。 假設這是一個遊戲場景。 下面這是相機的視口,相機的視覺是看不到很大立方體後面的那些小的立方體。   在運行遊戲的過程中,我們為了提高遊戲的效能,我們不希望渲染相機看不到的物體。

理解TCPUDP協議

還要 資源 tcp 協議 code 長時間 tcp連接 一對多 客戶機 情況 目錄 TCP 協議 UDP協議 TCP和UDP的區別 TCP和UDP的使用場景 一 TCP協議 1.TCP的頭部格式 理解TCP協議,首要的就是TCP協議的頭部格式 ·

對Yii2中 yiiwebUser的理解自建的appmodelsUser(基礎版),frontendmodelsUser的應用原理

end his iat getter authent property 用戶id tails uniq yii\web\User 是一個統稱,為用戶,沒有具體實例,只能管理; 此處以app\models\User為基準; app\models\User 是映射數據表us

C# 用實例來理解IComparableIComparer

大於 sum summary spa 必須 理解 實例 eap bject 通過Array的Sort方法來理解的 Sort方法要 通過對象去繼承IComparable接口來實現排序(當然也有其它辦法),我想入門這可能就是對這句話有點不理解,在下面會有註釋 using

OpenStack實踐系列⑦深入理解neutron虛擬機

ice 賬號 由器 1.0 鏡像 多租戶 ridge 不同的 img OpenStack實踐系列⑦深入理解neutron和虛擬機 五、深入理解Neutron 5.1 虛擬機網卡和網橋 [[email protected]/* */ ~]# ifconfig

一個例子理解breakcontinue的區別

print 循環 str string out void i++ continue sys 結論:break用於終止整個循環,而continue用於終止某一次循環。public class Test {   public static void main(String[]

【轉】理解Callable Spring DeferredResult

控制 defer -a word int https .html getc when http://www.cnblogs.com/aheizi/p/5659030.html 1-介紹 Servlet 3中的異步支持為在另一個線程中處理HTTP請求提供了可能性。當

從源代碼來理解ArrayListLinkedList差別

表示 得到 代碼 -a art 一個 http 指定 lin 從源代碼理解ArrayList和LinkedList差別 ArrayList ArrayList默認容量為10,實質是一個數組用於存放元素,size表示ArrayList所包括的元素個數。

基礎知識《十二》一篇文章理解CookieSession

alt str web應用 rfi 密鑰 hide 開始 單位 ews 理解Cookie和Session機制 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Co

java之JVM學習--簡單理解編譯運行的過程之概覽

層次 概覽 聲明 是否 class 異常處理器 語義 net ots java代碼編譯流程圖: java字節碼執行由JVM執行引擎完成 Java代碼編譯和執行的整個過程包含了以下三個重要的機制: Java源碼編譯機制 類加載機制 類執

深入理解cookiesession

上一個 action inpu 用戶 character method 角色 默認 image cookie和session在java web開發中扮演了十分重要的作用,本篇文章對其中的重要知識點做一些探究和總結。(轉發自https://www.cnblogs.com/ro

理解ServletServlet容器、Web服務器等概念

發送 ipc機制 如何 處理流 文章 常用 servlet實例 java技術 get 轉載自http://blog.csdn.net/iAm333 之前在開源中國看到一篇文章《初學 Java Web 開發,請遠離各種框架,從 Servlet 開發》,覺得很不錯。想到自己之前

如何理解事件委托

方式 tel 運算 using 來看 操作 new 不理解 什麽是 我喜歡將書中的知識看懂後形成個人的理解: 一、你如何理解委托 如果我們不理解決委托,那應該都理解類,那我們就從類角度來看看什麽是委托。 在我看來類和委托是同一級別的東西