細(xì)數(shù)OSG中的“神來之剪”
“裁剪”
就是從大量的事務(wù)中進(jìn)行挑選、刪除
對(duì)一個(gè)龐大的三維體而言,往往存在著大量無助于最終渲染結(jié)果的對(duì)象;將它們從場(chǎng)景中剔除后,將剩余的場(chǎng)景對(duì)象發(fā)送到OpenGL管線中,即可完成一幀的繪制工作。
這類型的裁剪工作通常稱為“可見性裁剪”,即只有真正能夠被終端用戶看到的對(duì)象才會(huì)被發(fā)送到渲染管線中。

常見de裁剪技術(shù)
背面裁剪
當(dāng)我們觀察一個(gè)不透明物體時(shí),通常大約有一半的物體表面是看不到的,因此完全可以省去這一半的繪制工作,場(chǎng)景的多邊形復(fù)雜度也將降低1/2左右。
osg本身提供了如下圖的背面裁剪的實(shí)現(xiàn)函數(shù):

視椎體裁剪
視椎體裁剪就是將不在視椎體中的物體剔除掉不繪制,而在視椎體內(nèi)部或與視椎體相交的物體繪制的方法,此舉對(duì)性能的提升有著巨大的幫助。
通常,物體是不規(guī)則的,為了方便,我們用該物體的包圍球與當(dāng)前視錐體進(jìn)行比較。
如果包圍球在視錐體外,那么不需要繪制此包圍球所表達(dá)的節(jié)點(diǎn)及其所有的子節(jié)點(diǎn)。如下圖所示,紅色方塊在視錐體外,該方塊將被裁剪。

視錐體裁剪包括近平面裁剪、遠(yuǎn)平面裁剪以及視錐體側(cè)面裁剪三部分。
下圖中setProjectionMatrixAsPerspective中的參數(shù)zNear、zFar就是對(duì)在osg中對(duì)相機(jī)的遠(yuǎn)近裁剪面的設(shè)置。
NEAR_PLANE_CULLING是近平面裁剪,將超出近平面范圍以外的對(duì)象裁剪:

細(xì)節(jié)裁剪
場(chǎng)景中某些物體對(duì)于觀察者而言可能是極其微小的,足以忽略不計(jì),此時(shí)可以用細(xì)節(jié)篩選特性將它們剔除。
判斷對(duì)象是否足夠細(xì)微,需要用一個(gè)像素閾值來決定!
注意,這種篩選可能會(huì)剔除一些必要的信息(比如用戶在屏幕上繪制了一些點(diǎn),卻發(fā)現(xiàn)它們?nèi)勘煌淌傻袅耍?/span>,因此它是一種通過犧牲質(zhì)量來換取速度的技術(shù)~

遮擋裁剪
判斷場(chǎng)景中的物體是否有互相遮擋關(guān)系,剔除那些被完全遮擋的對(duì)象,保留可見物體。但是,完全的遮擋測(cè)試算法往往具有過高的復(fù)雜度,需要判斷每個(gè)場(chǎng)景對(duì)象與其他對(duì)象的遮擋關(guān)系,導(dǎo)致計(jì)算帶來的開銷大于繪制帶來的開銷,并不實(shí)用!
比較常見的方法是定義一種“遮擋板”對(duì)象(在osg中使用OccluderNode節(jié)點(diǎn)),其形狀不固定,并且可以遮擋場(chǎng)景中的其他對(duì)象。
少量的遮擋板可以有效的增加場(chǎng)景的裁剪效率,尤其在室內(nèi)景物的裁剪等場(chǎng)合,使用遮擋板來模擬墻面和門體是再好不過的選擇~
在osg中OccluderNode本身并不具備遮擋能力,需要指定一個(gè)遮擋面osg::ConvexPlanarOccluder來進(jìn)行遮擋。

聚集裁剪
這是一種類似于背面篩選的場(chǎng)景篩選方法,但是他可以將多個(gè)對(duì)象組合起來進(jìn)行統(tǒng)一的背面篩選,從而加快背面篩選的速度。
其基本原理是使用一種截?cái)鄨A錐體來包含某組幾何體的所有法線方向和所有點(diǎn)。
圓錐的定點(diǎn)位于一個(gè)控制點(diǎn)cp,并使用法線n和半角A輔助進(jìn)行定位。因此對(duì)于視點(diǎn)eye如果出現(xiàn)下面的條件:

則認(rèn)為視點(diǎn)位于該截?cái)鄨A錐的背面,應(yīng)當(dāng)統(tǒng)一剔除它所包含的多個(gè)幾何體,如下圖所示:

在osg中聚集裁剪相關(guān)的類名稱為ClusterCullingCallback,使用方法如下圖所示:
