Unity3D InstantOC遮擋剔除

2021-10-02 08:24:48 字數 2603 閱讀 3745

instantoc(外掛程式)

圖形資料在gpu上經過運算處理,最後輸出到螢幕的過程。

對於顯示出來的圖形,cpu與gpu的分工

cpu判斷需要顯示的圖形影象

呼叫圖形api;

繪製呼叫(draw call):每次引擎準備資料並通知gpu的過程,即每幀呼叫顯示卡渲染物體的次數。即下圖中的batches

3.到顯示卡gpu這,主要做如下處理:

頂點處理:從cpu接收模型(網格模型)頂點資料,然後做座標轉換。

圖元裝配:組裝面,即繪製三角面;

光柵化:計算面上的畫素,為著色提供合理的插值引數;

畫素處理:畫素著色,寫入快取;

幀快取與深度快取z-buffer:儲存畫素的深度資訊,畫素離攝像機的距離,進的替代遠的畫素;            

即時遮擋剔除(instantoc):攝像機視角內看不到的物體進行剔除,減少每幀的渲染數量,在送入渲染流水線;

攝像機視野:

對上述場景做遮擋剔除,步驟如下:

首先新增乙個層ioc_layer和乙個標籤ioc_tag,將要做動態遮擋剔除的物體加入到該層中和選擇該標籤中,如下。

2. 將instantoc中的如下圖中的檔案拖拽到攝像機上

在屬性面板**現該檔案的設定屬性,如下

3.設定layer mask和tags分別為ioc_layer和ioc_tag

1)layer mask:參與遮擋剔除的物件層;

2)tags:為指定的標籤物件自動新增ioclod指令碼物件;

3)sample(取樣):

原理:在攝像機視野範圍內,隨機放出射線,若打到物體上,則該物體需要渲染,若打不到,則取消該物體的mesh renderer前的勾(不渲染);

取樣:發出的射線的數量,通常設定在150-500之間;

4) rays fov:射線視野,應大於攝像機視野field of view。

5)view distance:檢視距離,射線長度,參照影響攝像機clipping planes-far數值。

6)hide delay:延遲隱藏,當物體被剔除時延遲的幀數,建議50-100之間。即發射射線的次數,若每次某物體都不可見,則剔除。

7)precull check:檢查採集資訊,建議勾選,提高剔除效率;

8)realtime shadows:實時陰影,如果場景需要實時陰影,確保剔除物體顯示正常的陰影(該功能不穩定)。

4. 為將需要做遮擋剔除的物體新增盒狀碰撞器,而不是使用物體的實際的面來做射線碰撞。而是使用盒狀的6個面。

遮擋剔除使用情況:在場景中,物體比較密集,遮擋的物體較多時,可以使用遮擋剔除,否則會真加cpu的負擔。

5.執行效果(中間被遮擋的不渲染,不可見):

移動一下前面的物體,後面的又出現了,如下:

前後draw call對比:可知batches減少了(30à24),降低了顯示卡的負擔。

lod技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。

通過instantoc中的如下設定來實現

主要的意思是:乙個物體有三個不同精細程度的模型,在0-20距離內,使用精細高的模型,在20-40距離內使用中等精細模型,在40距離以外,使用低精細模型。主要影響下圖中的面數和頂點數。

1)新增乙個物體作為父物件,有三種不同精細程度的模型作為子物件,並命名為lod_0lod_1lod_2(命名必需為這個)。

2)攝像機新增ioccam,模型父物件新增盒狀碰撞器

3)改變攝像機的位置,可以看到mesh renderer前的勾會改變,有勾的會渲染。

Unity學習筆記 3

rigidbody 剛體元件,使物體具有重力效果,碰撞 呼叫剛體裡的方法 verctor3 向量,1,0,0 向x的方向施加乙個力 rd.addforce new vector3 1,0,0 得到水平的乙個值,返回 1 1之間的數,相當於a d建 float h input.getaxis hori...

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

Unity3D高階4 6 Unity3D 多執行緒

unity3d從入門到高階 文章目錄及設定這個專欄的初衷 大家是不是一看這個標題都想吐槽了,因為很多資料都介紹unity不支援多執行緒,unity的多執行緒其實都是協程等等說法,然而協程也並不是真正的多執行緒。協程其實是等某個操作完成之後再執行後面的 或者說是控制 在特定的時機執行。那unity到底...