2008-11-25 36 views
3

我是新來的撲殺。乍一看,大多數遮擋剔除算法似乎都是對象級別的,而不是檢查單個網格,這對於遊戲渲染來說是實用的。最有效的網格級最佳遮擋剔除算法?

我所尋找的是,剔除被遮擋對於一個給定的觀點,具有高精度的單個對象中的所有網格的算法。它至少需要至少O(n log n),一個幼稚的逐個網格比較(O(n^2))太慢。

我注意到,攪拌機GUI標識被遮擋的網格,你實時的,即使你用的10000個網格大對象。在那裏使用什麼算法,祈禱?

回答

1

你看過像Octrees這樣的東西嗎?

+0

四叉樹可能已經足夠了,因爲它正在尋找2維(而不是3)的重疊。 – Edmund 2010-04-10 23:31:31

0

通常情況下,你要做的第一件事就是看網格物體是否有相互閉塞的可能。通常使用簡單的邊界圖元(邊界框或邊界球)。如果我沒有記錯,Octrees將對此有所幫助。

1

剔除不是在網格層上進行的原因是網格是一個非常笨的渲染器級別的對象,而遊戲對象是在場景級別,所有的剔除發生。沒有進行網格級別的剔除決策,它們只是一種對具有相似着色器狀態的基元進行批處理(如果其對象需要進行渲染)的方法。

如果你真的需要在網格層剔除,那麼你可能需要創建每個網格一個對象,然後創建一個包含網格對象的一組對象。請注意,實際上你可能會失去表現,因爲在網格級別進行選擇通常是不值得的;它可能會破壞數據傳輸到硬件的流程。

0

我試圖天真的方法這實際上是足夠快,我的應用程序。

對於網格中的每個三角形,檢查是否被網格中的任何其他三角形遮擋,因此O(n2)。 (我僅通過檢查每個三角形的中心點是否被遮擋來獲得高準確度的結果,但如果精度很重要,您至少也應該檢查三角形頂點)。

在奔騰4機器(C++)上,一個二進制STL對象〜10,000個三角形花了大約1分鐘完成

該算法可以被優化到〜由面積大小或距離視點第一分揀三角形,例如(更可能阻塞,所以可以跳過更多的檢查)40%。

接下來的優化步驟是將三角形放在八叉樹中,這應該大大減少遮擋檢查的次數。

3

攪拌機同時執行視域剔除和遮擋剔除,基於從子彈物理庫動態AABB樹加速結構。遮擋物和物體由其邊界體積(軸對齊邊界框)表示。

查看截錐體剔除只是穿過AABB樹,給定一個攝像頭截錐體。

遮擋剔除基於遮擋緩衝區,一種使用非常簡單的軟件渲染器初始化的深度緩衝區:使用動態AABB樹加速結構的基本光線跟蹤器。您可以選擇遮擋緩衝區的分辨率來交換精確度和效率。

又見文檔從Blender源代碼樹http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.49/Game_Engine#Performance

攪拌機實現: 攪拌機\源\ gameengine \物理學\子彈\ CcdPhysicsEnvironment.cpp方法 布爾CcdPhysicsEnvironment :: cullingTest(PHY_CullingCallback回調,void *的用戶數據,PHY__Vector4 * plane,int nplanes,int occlusionRes)

Bullet Physics SDK在Bullet/Extras/CDTestFramework中有一些C++示例代碼。