Occlusion Culling(遮擋剔除)(轉(zhuǎn))

Occlusion Culling(遮擋剔除)
unity 性能優(yōu)化之遮擋剔除(Occlusion Culling) 官方版
OcclusionCulling

什么是Occlusion Culling(遮擋剔除)?

遮擋剔除, 當(dāng)一個(gè)物體被其他物體遮擋住而不在攝像機(jī)的可視范圍內(nèi)時(shí)不對(duì)其進(jìn)行渲染。.遮擋剔除在3D圖形計(jì)算中并不是自動(dòng)進(jìn)行的。因?yàn)樵诮^大多數(shù)情況下離 camera 最遠(yuǎn)的物體首先被渲染,靠近攝像機(jī)的物體后渲染并覆蓋先前渲染的物體(這被稱為重復(fù)渲染"overdraw"). 遮擋剔除不同于視錐體剔除. 視錐體剔除只是不渲染攝像機(jī)視角范圍外的物體而對(duì)于被其他物體遮擋但依然在視角范圍內(nèi)的物體,則不會(huì)被剔除. 注意當(dāng)你使用遮擋剔除時(shí)你依然受益于視錐體剔除(Frustum Culling)

場(chǎng)景渲染無遮擋剔除
場(chǎng)景渲染帶遮擋剔除

遮擋剔除是如何工作的?
遮擋剔除的運(yùn)行將通過在場(chǎng)景中使用一個(gè)虛擬的攝像機(jī)來創(chuàng)建一個(gè)物體潛在可視性狀態(tài)(set)的層級(jí)。 這些數(shù)據(jù)可以實(shí)時(shí)讓每個(gè)攝像機(jī)來確定什么能看見什么看不見。通過這些數(shù)據(jù),Unity 將確定只把可以看見的物體送去渲染。這將降低 繪制調(diào)用(draw calls) 的數(shù)量并增加 游戲的運(yùn)行效率。

遮擋剔除的數(shù)據(jù)由單元格(cells)組成, 每個(gè)單元格是在整個(gè)場(chǎng)景的包圍體積的一部分,單元格來自一個(gè)二叉樹( binary tree),遮擋剔除使用兩棵樹, 一個(gè)給 View Cells (靜態(tài)物體) ,另一個(gè)給 Target Cells (移動(dòng)物體)。 View Cells 映射到一個(gè)定義靜態(tài)可視物體的索引列表 (精確剔除后的靜態(tài)物體)。

其實(shí)這就是unity遮擋剔除的算法,但是unity并沒有開源出來,具體怎么實(shí)現(xiàn)不清楚。有知道的同學(xué)麻煩告知一聲,謝謝。

更新:unity 使用的是Umbra作為中間件。Umbra是一個(gè)芬蘭中間件公司,做出核心技術(shù)之后,于2007年成立,專注于解決3d可見性。

參考:
三維渲染中的裁剪總匯
大地圖開發(fā)管理:《巫師3》Umbra遮擋剔除技術(shù)

非常重要的一點(diǎn)是在創(chuàng)建你的物體時(shí)要隨時(shí)注意,因?yàn)槟阈枰谖矬w的大小和單元格的大小間取得一個(gè)好的平衡. 理想情況下,不應(yīng)該有相比于物體,太小的單元格,但同樣,物體不應(yīng)該覆蓋許多單元格.有時(shí)你可以通過將大的物體拆成幾個(gè)部分來改進(jìn)遮擋剔除效果. 然而,你仍然能夠?qū)⑿〉奈矬w合并在一起,來降低繪制調(diào)用次數(shù)(draw calls), 在它們都屬于同一個(gè)小單元格的時(shí)候, 遮擋剔除將不起作用。單元格的集合和可視信息確定哪些單元格是可見的,被認(rèn)為是 PVS (潛在可視集合Potentially Visible Set)。
\color{red}{這里其實(shí)已經(jīng)說得比較清楚了,我們?cè)趧?chuàng)建物體的時(shí)候盡量跟單元格大小差不多,因?yàn)榭赡軁
\color{red}{是基于性能的考慮,算法只是對(duì)單元格進(jìn)行粗略計(jì)算遮擋關(guān)系,對(duì)于那些占了許多個(gè)單元格}
\color{red}{的物體,有可能因?yàn)槟骋粋€(gè)單元格沒有被認(rèn)為是遮擋,而導(dǎo)致整個(gè)物體沒有遮擋,所以建議}
\color{red}{大的進(jìn)行拆分,而對(duì)于太小的物體,許多個(gè)小物體才導(dǎo)致填滿一個(gè)單元格,此時(shí)單個(gè)物體其}
\color{red}{實(shí)已經(jīng)對(duì)算法已經(jīng)不起多大作用了,另一個(gè)重要的原因就是多個(gè)小物體可能需要更多的繪制}
\color{red}{次數(shù)(drawcall),所以建議合并。然而,然而,一個(gè)單元格到底有多大????并沒有告}
\color{red}{訴我們,各位同學(xué)誰知道,也麻煩告知一聲,謝謝啊}

更新:需要注意的是,對(duì)象若太大,對(duì)遮擋剔除來說,意義不大,太小構(gòu)建時(shí)間太長(zhǎng),頂點(diǎn)數(shù)也多,造成過多的drawCall,總之,注意平衡!沒有放之四海而皆準(zhǔn)的方法。這說明并沒有一個(gè)具體的參考指標(biāo),只有靠實(shí)踐了。

如何設(shè)置設(shè)置遮擋剔除?
為了使用遮擋剔除 需要進(jìn)行相關(guān)的手動(dòng)設(shè)置。首先,你關(guān)卡中的幾何體必須被分割成合理大小的塊。這也有助于布置關(guān)卡中小塊的,明確界定的區(qū)域 被其他大物體遮擋(例如墻,建筑物)。這意味著每個(gè)單獨(dú)的網(wǎng)格根據(jù)遮擋數(shù)據(jù)確定是否渲染。所以如果你有一個(gè)物體包含了房間里的所有家具,那么所有的家具要么全渲染,要么全不渲染。 使每個(gè)家具都有自己的網(wǎng)格,這會(huì)有不一樣的感覺,那么可以根據(jù)攝像機(jī)的視點(diǎn),各個(gè)物體可以單獨(dú)地被剔除。
\color{red}{這里提到合理大小的塊,不知道是不是暗示遮擋剔除算法其實(shí)是會(huì)動(dòng)態(tài)計(jì)算得到一個(gè)較優(yōu)的單元格大小。}

在檢視面板(Inspector) 你需要標(biāo)識(shí)(tag) 所有需要應(yīng)用遮擋剔除的場(chǎng)景物體。最快的方法是選擇多個(gè)想要遮擋計(jì)算的物體,然后標(biāo)記它們?yōu)镺cclusion Static 和 Occludee Static。

為遮擋標(biāo)記物體
我應(yīng)該在什么時(shí)候使用Occludee Static?透明物體不能遮擋,以及小物件,都不可能阻擋其他的東西,應(yīng)標(biāo)記為Occludees,但不遮擋。這意味著它們將被視為能被其他物體遮擋,但不會(huì)被視為作為遮擋物自身,這將有助于減少計(jì)算量。

遮擋剔除窗口中如何設(shè)置?
首先打開遮擋剔除窗口(Window->Occlusion Culling)。在遮擋剔除窗口,可以使用遮擋物網(wǎng)格和遮擋區(qū)域。
—>Object選項(xiàng)卡
Screne Filter 可以選擇編輯的對(duì)象類型,選中對(duì)象后可以調(diào)整其靜態(tài)標(biāo)識(shí)。

注意:
1.如果你沒有創(chuàng)建遮擋區(qū)域,遮擋剔除將默認(rèn)應(yīng)用到整個(gè)場(chǎng)景。
2.每當(dāng)相機(jī)在遮擋區(qū)域之外,遮擋剔除將不被應(yīng)用。重要的是這種遮擋區(qū)域覆蓋的地方要有相機(jī),但如果遮擋區(qū)域太大,會(huì)導(dǎo)致更多烘焙開銷。
3.Occlusion Areas應(yīng)用于要實(shí)現(xiàn)遮擋的運(yùn)動(dòng)物體。(轉(zhuǎn)另一篇)
—>Bake選項(xiàng)卡

這里可以設(shè)置物體遮擋的屬性:
->Smallest Occluder: 最小遮擋物的尺寸(能遮擋其他物體的最小尺寸,任何小于這個(gè)尺寸的背后物體將被遮擋)
->Smallest Hole: 該值表示相機(jī)應(yīng)該看到的幾何圖形之間的最小間隙。
->Backface Threshold:Unity的遮擋使用數(shù)據(jù)大小優(yōu)化,通過測(cè)試背面減少不必要的細(xì)節(jié)。默認(rèn)值為100是強(qiáng)大的,不會(huì)從數(shù)據(jù)集中刪除背面。值為5將根據(jù)具有可見背面的位置積極減少數(shù)據(jù)。這個(gè)想法通常,有效的攝像機(jī)位置通常不會(huì)看到許多背景 - 例如,地形下面的視圖,或者您不應(yīng)該能夠到達(dá)的固體對(duì)象中的視圖。在閾值低于100的情況下,Unity將完全從數(shù)據(jù)集中刪除這些區(qū)域,從而減少遮擋的數(shù)據(jù)大小。

在烘烤標(biāo)簽的底部是清除和烘培按鈕。點(diǎn)擊烘培按鈕開始生成遮擋剔除數(shù)據(jù)。生成數(shù)據(jù)后,您可以使用“可視化”選項(xiàng)卡來預(yù)覽和測(cè)試遮擋剔除。如果您對(duì)結(jié)果不滿意,請(qǐng)點(diǎn)擊清除按鈕刪除先前計(jì)算的數(shù)據(jù),調(diào)整設(shè)置,然后再烘培。
—>Visualization選項(xiàng)卡

可以通過選擇查看所有物體或者只看攝像機(jī)看到的物體,來檢查剔除效果。

遮擋剔除消除drawcall的效率是非常高的,在一些大場(chǎng)景中往往能降低未優(yōu)化時(shí)drawcall數(shù)量的50%甚至更多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容