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