3D游戲場景中的可視性處理
BSP樹存在明顯的缺點(diǎn),如果要處理的是一個(gè)“有門”的場景,觀察者還可以透過門或者窗看到其它房間的物體,而看到得可能只有其它房間很少的物體,這樣如果對(duì)每個(gè)房間都創(chuàng)建單一的BSP樹的話就是很低效的。在這種情況下可以使用Portal技術(shù),常對(duì)于一個(gè)室內(nèi)場景來說它可以被描述為由一個(gè)個(gè)“洞口”相互連接的“房間”組成,這里“洞口”被稱為portal而“房間’,被稱為sector,通常sector被定義為一個(gè)“凸”的“閉合”的多邊形集合。portal引擎的基本方法是當(dāng)通過一個(gè)指定觀察位置的視見約束體(view frustum)進(jìn)行渲染時(shí),如果一個(gè)portal出現(xiàn)在可視范圍內(nèi),那么portal將對(duì)視見約束體進(jìn)行剪切,這樣與其相連的sector將會(huì)通過一個(gè)觀察位置相同但己經(jīng)改變過的視見約束體進(jìn)行渲染。這是一個(gè)非常簡單而且非常適合進(jìn)行遞歸調(diào)用的方法,由于視見約束體被portal進(jìn)行了精確的限制,因此被隱藏的物體可以很簡單進(jìn)行剔除。
一個(gè)portal引擎雖然能夠提供許多非常好的特性,但是它的結(jié)構(gòu)太復(fù)雜。當(dāng)你使用portal技術(shù)來構(gòu)建一個(gè)渲染系統(tǒng)時(shí)存在問題,最大的一個(gè)問題是在渲染場景的每一幀都需要進(jìn)行可視性檢測(cè),這會(huì)產(chǎn)生大量的多邊形剪切操作,在場景非常復(fù)雜的情況下,運(yùn)算的代價(jià)會(huì)非常的高,因此需要尋找一種技術(shù)來對(duì)場景中可視性檢測(cè)進(jìn)行預(yù)計(jì)算而不是在運(yùn)行期間進(jìn)行計(jì)算。PVS (PotentiallyVisible Set)可視性集合,就是為了解決這個(gè)問題而出現(xiàn)的一項(xiàng)技術(shù),可以通過對(duì)BSP中每一個(gè)葉節(jié)點(diǎn)設(shè)置一個(gè)PVS,這個(gè)PVS保存了從第一個(gè)葉節(jié)點(diǎn)開始看到的葉節(jié)點(diǎn)集合,它不僅可以用來幫助加速場景渲染,還可以用來加速場景中光照運(yùn)算和進(jìn)行網(wǎng)絡(luò)優(yōu)化。PVS是在場景進(jìn)行預(yù)渲染時(shí)計(jì)算出來的,每一個(gè)BSP的葉節(jié)點(diǎn)都保存一個(gè)可視節(jié)點(diǎn)的集合,當(dāng)對(duì)場景進(jìn)行渲染時(shí),攝象機(jī)所在的葉節(jié)點(diǎn)將被渲染,同時(shí)保持在PVS中的葉節(jié)點(diǎn)也將會(huì)被渲染出來,這里需要一些算法來避免場景重復(fù)渲染,由于今天硬件加速卡的發(fā)展,它所提供的硬件Z緩沖的大小己經(jīng)可以方便的解決這個(gè)問題。