2013-02-16 35 views
0

編輯:LWJGL/OpenGL的:處理動態地形素與dyanmic LOD與維也納組織和VAOs

我有詳細的不斷變化的水平塊。每當塊的細節水平發生變化時,我都必須重新計算要繪製的頂點。由此導致頂點數量動態變化。

我的問題是,我不知道如何去繪製這個。我想我可以刪除舊的緩衝區,然後重新加載新的緩衝區。這是否有效或每隔幾秒刪除並重新加載緩衝區都不好?有沒有更好的方式去做這件事?

這裏是我想過這樣做:

//delete old buffers 
    GL20.glDisableVertexAttribArray(0); 

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
    GL15.glDeleteBuffers(vboID); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
    GL15.glDeleteBuffers(vboiID); 

    GL30.glBindVertexArray(0); 
    GL30.glDeleteVertexArrays(vaoID); 

//reload buffers with new vertex data 
    vaoID = GL30.glGenVertexArrays(); 
    GL30.glBindVertexArray(vaoID); 

    vboID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); 
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertex_buffer, GL15.GL_DYNAMIC_DRAW); 
    GL20.glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 

    vboiID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiID); 
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, index_buffer, GL15.GL_DYNAMIC_DRAW); 
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 

    GL30.glBindVertexArray(0); 

必須有一個更好的方式來做到這一點比不過......我可能只是缺少一些關鍵的概念,像往常一樣,所以請讓我知道我是否因爲試圖這樣做而成爲一個完全白癡。謝謝!

回答

0

嘗試使用glBufferSubData(),它必須是你需要的。

+0

這是否允許我動態地將數據添加到列表中,而不是隻覆蓋已存在的數據? – CoderTheTyler 2013-02-17 07:14:28

+0

我真的不知道,但我讀過它。我認爲這是關於OpenGL的問題。 – shestakoffvs 2013-02-19 07:55:34