最簡單的流水線可見性處理如下:
對每個物體轉換到世界座標,然後進行視椎體剔除,其次是背面消隱,最總通過空間剪裁和光柵化期間的圖像空間裁剪得到最終的要繪製的圖像。
在場景很簡單,物體很少的情況,上述方法是可行的。但考慮到現代遊戲的場景複雜程度,如果還採用上面的流水線來提出多邊形,就顯得力不從心了,因爲這意味着在每次移動攝像機的時候都要對場景中的所有的物體進行視椎體的剔除及背面消隱,而這根本是不肯能的。
因此,就迫切一種方法,能快速的對大部分場景進行剔除操作。進一步說就是,能根據當前視點位置快速得到當前可見的多邊形集合。
而這就需要對空間進行有效的劃分,即對物體要有一個有效的管理。
常見空間劃分算法有:
BSP、BHV、OCTREE等
常見的可見性算法有:
PVS、OC、portal等
下面先對最重要的BSP算法進行簡單的分析:
BSP樹的原理:使用分割面將空間劃分成凸形子空間構成的二叉樹。
BSP樹的應用:
<1>大規模剔除物體。
<2>碰撞檢測。
<3>可以根據視點的位置很快的確定當前正確的渲染順序(從後到前或從前到後)。(注:現在的遊戲99%都不採用該方法進行渲染)
根據BSP樹的原理,很容易聯想到,如果把多邊形自身作爲分割面,則有可能在擁有很多房間或關卡的室內場景遊戲中發揮作用。
具體來說就是以多邊形鏈表作爲輸入提供給空間劃分系統來創建BSP樹。
步驟:
<1>選擇第一個多邊形作爲分割面。如果鏈表中只剩一個多邊形或沒有多邊形則算法結束;
<2>判斷下一個多邊形在分割面的前面還是後面,分別添加到front和back鏈表中;
<3>遞歸處理front和back鏈表;
顯示和訪問BSP以根據當前視點獲得正確的繪製順序由於應用不多,在此就不在詳細介紹了。
創建BSP樹對時間是不敏感的,因爲將通過某種建模工具生成模型及對應的BSP數並保存到磁盤中,即創建樹的過程是離線的。
(留個問題以後詳述:什麼工具可以生成BSP,怎麼生成,以什麼格式保存,在使用時又是如何加載?)
BSP樹的侷限性:只適合半靜態場景,如果多邊形在本超平面內平移,BSP樹是不會改變的,但是如果旋轉多邊形則需要重新生產BSP樹。
下面討論一下BSP在剔除上的應用:
凸形子空間特性和便利的線性時間複雜度使BSP樹非常適合於大規模剔除操作。
下次主要討論:
<1>背面消隱
<2>視景體剔除