我有一個存儲在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
會很好。這聽起來正確嗎?