Unity3D之InstantOC(遮擋剔除)
首先要先從網上下載InstantOC組件(網上資源很多的不用跟我要)
那麽介紹一下這個組件是幹什麽用的,為什麽要用它,有什麽好處
在遊戲中我們看到的物體,是如何呈現給我們的呢?如圖:
渲染管線
CPU幹得事情
第一步 遊戲:其實就是CPU來判斷視錐以內,所能看到的物體都需要渲染
第二步 圖形API:它是要看你發布的平臺,不一樣平臺所需要的圖形API也就不一樣,比如Windows平臺就需要DX,手機端平臺就需要OpenGL等。。。。
第三步:繪制調用Draw Call每次引擎準備數據並通知GPU的過程,其實就是說每幀調用顯卡渲染物體的次數(CPU與GPU的分界線)
GPU幹得事情
第四步 頂點處理:接受CPU傳輸過來的頂點數據,來坐標轉換(模型都是有若幹個點和三角構成的)
第五步 圖源裝配(組裝面):連接相鄰的頂貼,繪制位三角形
第六步 光柵化:計算三角形的像素,並為後面著色階段提供合理的插入參數
第七步 像素處理:對每個像素區進行著色,並寫入到緩存中
第八步 緩存:一個存儲像素數據的內存塊,最重要的緩存是幀緩存和深度緩存
幀緩存:存儲每個像素的色彩,即渲染後的圖像,幀緩存常常子啊顯存中,顯卡不斷讀取並輸出到屏幕中
深度緩存:Z-buffer:存儲像素的深度信息,即物體到攝像機的距離,光柵化時變計算各像素的深度值,如果新的深度值比現有值更近,則像素顏色被寫到幀緩存,並替換深度緩存
通過上面的敘述知道了遊戲物體在渲染中是需要CPU和GPU共同來完成,那麽在這個過程中一旦數據量變大一定回造成電腦性能上的消耗,為了降低消耗所以要使用InstantOC這個組件。
那麽來介紹一下InstantOC,InstantOC全稱叫做Instant Occlusion Culling(遮擋剔除),為什麽要用它?因為在攝像機的視錐內也有被物體所被遮擋而看不見的物體如果一起渲染出來會浪費大量的性能!因此我們就可以用遮擋剔除來減少GPU的工作量但同時也會增加CPU的工作量,那麽如果在物體少或者沒有遮擋的情況下就不要使用了(遮擋剔除)因為如果所有物體都需要渲染的話那再使用遮擋剔除無疑是給CPU增加了負擔,那麽遮擋剔除總結:當物體被送進渲染流水線之前,將攝像機視角內看不到的物體進行剔除,從而減少每幀渲染的數據量,提高了渲染性能,介紹了這些那就開始介紹它如何使用吧!
第一步:從網上下載一個InstantOC
第二步:導入完成後可以在Unity3D面板中看到一個名稱叫做InstantOC文件夾,在這個文件中有一個IOCcam的C#腳本將它導入值攝像機(導入步驟也是托進去)
第三步:將導進攝像裏的IOCcam腳本來進行參數配置,在所需要遮擋剔除的物體上的Layer(層)和Tag(標簽)添加一個自定義的名稱 ,分別給Layer mask(遮罩層)和 IOC Tag(遮擋標簽)進行綁定
然後還需要設置Samples(取樣)其實就是攝像機向視錐以內的物體發射一些射線碰到了就渲染碰不到就不渲染(射線是看不到的)
那麽這些射線是隨機發射的如果場景太大射線少就會導致物體明明能看到因為射線的原因沒有碰到導致沒有去渲染,
或者射線太多導致性能降低所以在射線這裏是有一個規範的射線數量一般會設置在150-500之間
Rays FOV 射線遠視:應大於攝像機視野Fied of View
View Disance:視圖距離,射線長度將影響攝像機Clipping Planes——Far 數值
Hide Delay延遲隱藏,當物體被剔除是延遲的幀數,建議50-100之間(就是多讓射線,多試幾次畢竟射線是隨機的所以需要延遲隱藏那些看不到的物體)
PreCull Delay:這個一定要勾選
那麽在介紹一個這個組件上另外一個功能LOD!LOD全場叫Levels of Detail(多細節層次)LOD技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算
其實就是說當物體距離遠了的時候才用面數較低的模型來減少渲染運算的工作量,來保證性能的一步優化
來開始如何使用它吧
使用方法:還是剛剛的步驟不變,在圖下有這麽幾個屬性需要設置一下,分別是Lod 1 distance和Lod 2 distance這是指攝像機與模型之前的距離 1代表精模(面數比較高的模型)2代表中模(代碼面數一般的模型)如果超出這連個所設置的距離則會變成低模(面數比較低的模型),那麽把數值調整好了 模型怎麽辦呢?(不用擔心,工具本身是自帶這3個模型的)如圖 ,那麽這裏要說明一下 LOD是有命名規則的模型名稱一定叫Lod_0、Lod_1、Lod_2來區分模型的面數如圖,記得放到同一個空物體裏,最後一張是配置完成後的
Unity3D之InstantOC(遮擋剔除)