空間劃分及可見性算法【二】

先來複習一下背面消隱:

      前提爲左手座標系,每個三角形都會以一定順序存儲三個頂點,按照這個順序觀察三角形,如果是順時針方向則該面爲三角形的正面,另一個面爲三角形的背面。有了該假設,我們就可以計算三角形的面法線了,該法線垂直三角形面並指向三角形的正面。選擇三角形面上的一點爲起點,視點爲終點構造一個向量,起名叫做視點向量。根據法線向量和視向量的點積的符號很容易計算該面是否是正面朝向的,即是否可以被消隱。如果啓動了背面消隱則三角形只有一面是可見的,如果要求三角形兩面都可見則應該禁用背面消隱。

      禁用背面消隱:g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

 

      通過背面消隱可以消除一部分三角形,但是普通的背面消隱存在侷限性:

      <1>由於它沒有考慮觀察向量方向,所以可能會產生誤差。比如,通過普通背面消隱判斷爲可見的三角形,由於觀察方向向量會導致三角形實際是不可見的。

      <2>在室內環境中有很多面都是雙面可見的,這時普通的背面消隱就失去了存在的意義。

 

     所以必須把觀察向量考慮進來,產生一種新的更嚴格的背面消隱算法,具體算法就不在贅述了。

 

     有了上述的背面消隱算法,結合BSP樹會在視景體剔除中發揮極大作用。因爲如果根據背面消隱算法知道當前分割面相對視點是否可見,如果不可見,並且視點在分割面的背面則可以判斷出,在該分割面前面的所有的面都是不可見的。同理,如果視點在分割面的前面,且該分割面是不可見的,則可判斷在該分割面後面的所有的面都是不可見的。這樣就可以迅速的剔除視椎體以外的大量三角形。

 

     到此爲止,簡單的介紹了使用BSP樹對視椎體進行剔除的算法。但是,到目前爲止,插入到渲染列表中的的三角形在實際情形中還是有很多是不可見的,也就是冗餘的。爲了剔除這些冗餘三角形,就出現了PVS算法。

 

    PVS(潛在可見集),可以手動建立,也可以使用工具建立,可以存儲成數組,也可以存儲成矩陣,也存在很多編碼方式,在此不再贅述。總之是離線創建的。在插入到渲染列表之前在使用PVS來提取冗餘三角形。

 

    Portal(入口),是一種實時的PVS,它根據Portal的大小對視椎體進行裁剪,根據新的視椎體來確定PVS。具體怎麼實現以後再介紹。

 

    明天再介紹,BHV和8叉樹。

  

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章