Occlusion Culling(遮擋剔除)

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

場景渲染無遮擋剔除
場景渲染帶遮擋剔除

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

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

非常重要的一點(diǎn)是在創(chuàng)建你的物體時(shí)要隨時(shí)注意,因?yàn)槟阈枰谖矬w的大小和單元格的大小間取得一個好的平衡. 理想情況下,不應(yīng)該有相比于物體,太小的單元格,但同樣,物體不應(yīng)該覆蓋許多單元格.有時(shí)你可以通過將大的物體拆成幾個部分來改進(jìn)遮擋剔除效果. 然而,你仍然能夠?qū)⑿〉奈矬w合并在一起,來降低繪制調(diào)用次數(shù)(draw calls), 在它們都屬于同一個小單元格的時(shí)候, 遮擋剔除將不起作用。單元格的集合和可視信息確定哪些單元格是可見的,被認(rèn)為是 PVS (潛在可視集合Potentially Visible Set)。

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

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



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

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


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

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

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


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

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

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

相關(guān)閱讀更多精彩內(nèi)容

  • 這里使用的是unity5.5版本 具體解釋網(wǎng)上都有,就不多說了,這里主要說明怎么使用,以及參數(shù)設(shè)置和實(shí)際注意點(diǎn) 在...
    Jens丶閱讀 2,568評論 0 3
  • 首先介紹下draw call(這個東西越少你的游戲跑的越快): 在游戲中每一個被展示的獨(dú)立的部分都被放在了一個特別...
    楊夏MX閱讀 13,588評論 0 17
  • 意義 遮擋剔除,當(dāng)一個物體被其他物體遮擋住而不在攝像機(jī)的可視范圍內(nèi)時(shí)不對其進(jìn)行渲染。 不同于視錐剔除(只是不渲染攝...
    一文二毛閱讀 2,018評論 0 1
  • 序 4月23日是世界讀書日。設(shè)立讀書日的目的是推動更多的人去閱讀和寫作。尊重和感謝為人類文明做出巨大貢獻(xiàn)的文學(xué)、文...
    玉生煙218閱讀 295評論 0 1
  • 讀《小狗錢錢》的時(shí)候,是在我今年3月份失業(yè)的時(shí)候讀的。那個時(shí)候很缺錢,所以體會過,渴望金錢的感覺。這次重新閱讀,有...
    吳佩在天涯閱讀 752評論 2 3

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