2013-06-29 68 views
0

是否可以在不浪費舊內容的情況下向VBO添加更多數據?基本上有一種方法可以在保留舊內容的同時調整VBO的大小?OpenGL將更多數據添加到VBO

例如,可以說我交織一些顏色(CrCgCb)和位置(PxPy)數據在VBO使用兩個三角形,使得在VBO存儲器的抽象表示看起來像表示的正方形:

[P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b] 

現在一些事件蒸騰作用和突然的另一個方出生,我希望把它放在同一個VBO使得數據現在看起來像:

[P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b,P7x,P7y,C7r,C7g,C7b,P8x,P8y,C8r,C8g,C8b,P9x,P9y,C9r,C9g,C9b,P10x,P10y,C10r,C10g,C10b,P11x,P11y,C11r,C11g,C11b,P12x,P12y,C12r,C12g,C12b] 

爲了將第一批數據的我這樣做:

GLuint vbo; 
    glGenBuffers(1, &vbo); 
    float verticies[6 * 2 + 6 * 3] = ...; 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); 

我們在那裏得到第二平方我如下通常會做一些事情:

glDeleteBuffers(1, &vbo); 
    glGenBuffers(1, &vbo); 
    float verticies[12 * 2 + 12 * 3] = ...; 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); 

你如何做到這一點,而不必調用glDeleteBuffers()

回答

1

您正在尋找glBufferSubData。這不能調整緩衝區大小,但可以更改現有緩衝區中的數據。只要確保你的緩衝區從一開始就足夠大。一種常見模式是用BufferData和一個空指針初始化緩衝區到一定大小,然後用BufferSubData只更改它的一部分。

+0

感謝您的意見,但我已經意識到這一功能。它不適合我的原因是因爲我有一個非常動態的系統,並且我有內存限制。我不能調整VBO的大小,然後運行一些碎片算法。我想我最好的選擇就是維護一個矢量並動態調整大小。然後在時間到來的時候跟蹤哪些對象要繪製。加載所有數據的VBO,然後到glDrawArays使用開始和計數變量。不想要,但如果這是我唯一的選擇,那麼我會去用它。 –

+0

是的,這是您唯一的選擇。處理這樣的事情是使遊戲引擎有價值的原因。你必須管理你自己的記憶。通常最簡單的算法雖然夠用了。每個池1MB,像堆棧一樣增長並回收空池。 – starmole