遊戲引擎中的各種剔除演算法

2022-08-22 16:45:14 字數 1153 閱讀 4157

在引擎中最影響渲染效率的是場景管理,剔除演算法又是其中的最主要的內容。這裡簡單總結一下各種流行的遮擋剔除的演算法,只是為了我的遊戲引擎而做的一點功課。

1。bsp。binary space partition。優勢在於這種演算法的資料結構十分簡單(二叉樹),而且在效率方面非常好,因為強調了離線計算(即場景儲存為bsp的資料格式,在渲染前就載入生成bsp樹)。比較麻煩的是它的實現非常的複雜,而且用dx來實現會比gl更麻煩一點,因為bsp的劃分平面可能是三角形,矩形,或者其它的多邊形,用dx實現的時候往往要把這些平面分割成多個三角形。。。。另外的侷限是,用bsp適合於大量的靜態物體的場景,否則要在每一禎內計算生成bsp樹,失去了離線計算的優勢。用作物理的bsp和這裡的bsp是有區別的,有些人說的這種演算法可以同時用於渲染和作物理中的碰撞檢測,達到了計算上一種簡化。這種說法是錯的。當然指的是具體的實現了(物力上的bsp基本上還是用的包圍體,只是用bsp樹優化了判斷的次數)

2。pvs。potentially visible set。對於複雜的室內場景,pvs可以進一步的對bsp或者八叉樹進行優化,以剔除更多的面,避免大量重繪。這種方法同樣比較適合靜態場景。

3。portal。比較適合於室內場景。剔除的粒度小於pvs,在視點和入口之後生成乙個剪裁體。沒有pvs效率好,因為總是要進行實時計算。

4。bhv。bounding hierarchical volumes。這才是既可以用於渲染剔除,又可以用作物理計算的演算法。

!!「bsp過時了!!」??從某種意義上來說,是的。bsp的粒度還是停留在多邊形上(特別是三角形),這在沒有硬體剔除背面的老顯示卡上肯定是有用的,但是現在的顯示卡的硬體已經可以很好的解決這個問題,所以,為什麼還有把原本很好一條三角帶撕裂成碎片呢?要知道現在的顯示卡處理一次pass的能力已經很強了,相反在pass和pass之間成了主要的瓶頸,所以減少pass的次數,即在一禎內減少傳遞資料的次數才是關鍵。但是,bsp在物理方面的應用還是非常多,應為物理計算的粒度是三角形。

現在來看,如果乙個引擎需要做到室外和室內場景的無縫切換,最好的做法不是用多個版本的場景管理器,而是用乙個,當然這個管理器可以綜合幾個演算法的優點。所以如果像ogre一樣把不同的管理器做成不同的外掛程式,在遊戲執行時,場景管理器是不能進行切換的。我已經寫了包圍體的生成,準備octree來組織結構,也可以用octree來對外部的地形進行處理;在室內,octree也比較適合,不過如果能加上pvs和portal會更好一些。。。。

Zend引擎中對HashTable的各種操作

一邊學習c,一邊研究zend引擎,邊學習邊總結。hashtable的初始化 zend api int zend hash init hashtable ht,uint nsize,hash func t phashfunction,dtor func t pdestructor,zend bool ...

遊戲引擎中的相機系統

下面應用 微分幾何 中的歐氏空間等距變換,匯出從世界座標系到觀察座標系的變換,並結合directx9.0和c 來實現乙個簡單的相機類。1。假設世界座標係用i i,j,k 和o 0,0,0 來表示,觀察座標係用e e1,e2,e3 和p a,b,c 來表示,其中,e a i 這裡e和i表示為列向量 a...

2D遊戲引擎(十) 增強遊戲引擎中的子畫面

在2d遊戲中,如何對不需要的動畫子畫面進行自動隱藏或刪除?例如,當乙個 子畫面的幀動畫結束後,需要對此子畫面進行刪除操作。另外對此前的遊戲引擎中,除了對邊界動作為ba die的子畫面可以對其刪除外,還沒有提供乙個在一些特定時刻需對子畫面物件進行刪除操作的方法,比如碰撞時需要刪除互相碰撞的兩個子畫面。...