2012-01-04 91 views
2

我有一個存儲在VBO中的地形網格。網格是由直角三角形組成的網格。換句話說,它看起來像一個有對角線的直線網格。網格的寬度和高度是已知的,所以很容易計算給定XY的頂點索引,反之亦然。OpenGL 2.1:VBO中的緩衝區域

地形網格將是可編輯的。我的問題涉及在編輯地形時重新緩衝頂點數據。我將能夠確定任何編輯操作都會弄髒的頂點的矩形區域,所以顯然我更願意僅僅拒絕這些頂點,並讓其餘的單獨留下。

首先想到的是glBufferSubData。但我不能想出一種方法來佈局我的VBO,使glBufferSubData只會影響髒頂點。例如,假設我的網格是5 x 5個頂點。 (這實際上會更大,這僅僅是一個例子。)所示:

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 

(上面的圖中的每個數字表示頂點的從VBO的起始位置的偏移)

假設中心的3×3區域需要重建。這意味着我想打頂點6,7,8,11,12,13,16,17,和18。所以,我可以調用glBufferSubData開始於索引6和結束在18:

0 1 2 3 4 
    5 *6 *7 *8 *9 
*10 *11 *12 *13 *14 
*15 *16 *17 *18 19 
20 21 22 23 24 

(在上圖中,標記爲*的頂點被重新緩衝。)

請注意,頂點10,14和15不是髒的,但它們會被重新緩衝,因爲它們在glBufferSubData的範圍內。這使我感到效率低下。對於一個大網格來說,在大多數情況下,我會重新獲取比我需要的更多數據。

有沒有一個衆所周知的解決方案來解決這個問題?我應該每行撥打glBufferSubData一次(這可以解決目前的問題,但會自帶開銷)?還是僅僅爲了緩衝整個範圍而吃掉不必要的寫作的成本是標準呢?

此外,地形編輯有時會發生,但並不經常發生。當它這樣做時,它會被動畫化,所以當動畫發生時,不得不重新更新髒頂點。我在想GL_DYNAMIC_DRAW會很好。這聽起來正確嗎?

回答

3

您應使用緩衝對象mapping。您可以訪問緩衝區對象作爲內存數組,確實可以訪問稀疏的頂點。驅動程序(希望)會爲你優化它。使用GL_DYNAMIC_DRAW是正確的。