2011-12-31 95 views
1

我想知道OpenGL VBO是否僅用於大型幾何陣列,或者是否適用於小型陣列也是有意義的。我有相對於其他幾何體定位各種幾何體的代碼,但一些「葉」幾何體對象非常小,10x10四球體等(每個200個三角形)。我可能有很多這些小葉子對象。我希望能夠爲每個這些小葉子對象提供一個不同的變換矩陣。看起來我有兩種選擇:使用大量小型VBO的性能

  1. 爲每個葉對象使用一個單獨的VBO。我最終可能會有大量的維也納國際組織。

  2. 我可以將多個對象的數據存儲在一個VBO中,並在更改給定葉對象的數據時自己應用適當的轉換。這看起來很奇怪,因爲OpenGL的一部分就是要在硬件中有效地執行大量的矩陣運算。我會用軟件來完成OpenGL設計用於硬件的很好的功能。

是否有大量的VBO效率低下,還是應該繼續選擇選項1?有沒有更好的方法來處理有很多小物體的情況?我是否應該使用頂點數組或類似的東西?

回答

1

一些好的信息位於:http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

我認爲,每一個網格200個三角形也不是那麼少,也許與VBO網格不會下降這麼大的性能爲每一點。不幸的是它依賴於硬件規格。

一個巨大的緩衝區不會獲得巨大的性能差異...我認爲最好的選擇是每個VBO存儲幾個(但不是全部)對象。

使用一個緩衝區的renderin: 沒有問題...你只需要一個綁定的緩衝區,然後你可以使用不同參數的glDrawArrays。例如,如果一個網格由100名綠黨,並在第緩衝區你有這些網格10可以使用

glDrawArrays(triangles, 0, 100); 
glDrawArrays(triangles, 100, 100); 
glDrawArrays(triangles, ..., 100); 
glDrawArrays(triangles, 900, 100); 

以這種方式,你儘量減少改變緩衝區和你仍然能夠使其非常有效。

這些「小」對象是否一樣?它們是否具有相同的幾何形狀但具有不同的轉換/材質?因爲也許值得使用「實例」?

+0

什麼是實例? – Gravity 2011-12-31 20:51:27

+0

這裏是一些信息:http://sol.gfxile.net/instancing.html,但基本上它是一個優化的方式,多次渲染相同的對象(但是使用不同的轉換和材質) – fen 2012-01-01 16:37:18

2

最優化的解決方案如果你的數據是靜態的,由一個對象的是使用display lists和一個VBO只爲一個網格。否則,一般的規則是,你希望避免在主要繪製循環中進行渲染以外的任何操作。

  • 如果你永遠需要添加或刪除初始化後的對象(或變形的任何對象),那麼它可能是更有效的一個緩衝永久綁定,改變步幅/偏移值來呈現不同的對象。

  • 如果您只有一組基本的幾何圖形保持靜態,則使用一個VBO作爲它,併爲可添加/移除/變形的幾何圖形分開VBO。

  • 如果您可以隨意刪除對象或刪除對象,每個對象都應該有自己的VBO,以使內存管理更加簡單。

+0

即使我的幾何體保持靜態,我該如何處理不同變換可應用於不同葉子幾何對象的事實?或者是不被認爲是靜態的?將所有內容放入一個緩衝區,然後使用重複的'glDrawRangeElements'調用比創建具有幾何對象的緩衝區更有效嗎? – Gravity 2011-12-31 21:08:03

+0

在這種情況下,我將首先爲每個網格(不是每個對象,每個網格)分別設置VBO並分別處理它們的轉換。如果你發現它是一個性能問題,那麼我會優化。 – 2011-12-31 23:05:27

+5

哦主,顯示列表已棄用..... – 2013-02-06 11:56:01

相關問題