2010-07-07 105 views
3

我有一個與緩衝區對象性能有關的問題。我已經使用標準Vertex Arrays(不交錯)渲染了一個網格物體,並且我想將其更改爲Buffer Object以獲得一些性能提升。當我介紹緩衝區對象時,當我發現使用緩衝區對象使性能降低四倍時,我感到震驚。我認爲緩衝區應該會提高性能。這是真的嗎?所以,我認爲我做錯了什麼...OpenGL:緩衝區對象性能問題

我已經渲染3D平鋪地圖,並減少所需內存量我只使用一個單一的瓷磚(頂點集)來呈現整個地圖。我只更改每個貼圖的頂點位置的紋理座標和y值。用GL_DYNAMIC_DRAW參數創建位置和紋理座標的緩衝區。索引的緩衝區由GL_STATIC_DRAW創建,因爲它在地圖渲染過程中不會更改。因此,對於映射緩衝區的每個區塊至少映射一次並且不映射至少一次。我是否應該只使用一個緩衝區來創建紋理座標和位置?

感謝,

回答

2

嘗試移動你的頂點/紋理座標與GL_MODELVIEW/GL_TEXTURE矩陣,和(單獨GL_STATIC_DRAW)獨自離開緩衝區中的數據。例如如果瓷磚大小爲1x1,則創建矩形(0,0) - (1,1),並使用glTranslate設置其在世界中的位置。與紋理座標相同。

VBOs並不是爲了提高繪製少量四邊形的性能。當使用着色器繪製具有數千個多邊形的網格時,可以看到它們的真實能力。如果你不需要與更新的opengl版本進行任何向前兼容,我看不出使用它們來繪製動態變化的數據的用處。

+0

好的,謝謝。是的,我正在考慮使用紋理矩陣來移動紋理座標。我也通過使用GL_MODELVIEW來移動頂點座標,但是我需要改變每個頂點的一個值(y值),以將其調整到高度。順便說一句,這是更少的四邊形。 ;) – gaspode 2010-07-07 14:39:02

2

如果你需要更新每幀的緩衝區,你應該使用GL_STREAM_DRAW(它暗示緩衝區內容可能只用一次)而不是GL_DYNAMIC_DRAW(這暗示它們將被使用幾次在更新之前)。 就我的經驗而言,使用GL_STREAM_DRAW創建的緩衝區將被視爲與普通的ol數組類似,因此在使用它時應該期望與數組具有相同的性能。

此外,請確保您調用glMapBuffer的訪問參數設置爲GL_WRITE_ONLY,假定您不需要讀取緩衝區的內容。否則,如果緩衝區位於視頻內存中,則必須將其從視頻內存傳輸到主內存,然後再返回(對於每次地圖調用,這都取決於驅動程序......)。通過公共汽車傳輸大量數據是一個非常真實的瓶頸,很容易碰到。