2012-12-17 212 views
2

目前我正在編寫一個模擬水的程序。以下是我的步驟:OpenGL緩衝區更新

  1. 創建水面 - 飛機。
  2. 創建VAO
  3. 創建頂點緩衝區對象,其中存儲法線和頂點。
  4. 綁定指向此VBO的指針。
  5. 創建索引緩衝區對象。

然後我使用glDrawElements渲染這個平面,然後調用一個更改水面頂點位置的update()函數。之後,我調用glBufferSubData函數更新頂點位置。

當我這樣做 - 沒有任何反應,如果緩衝區沒有改變。

下面的代碼片段:

glGenBuffers(1, &vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Oscillator) * nOscillators, oscillators, GL_DYNAMIC_DRAW); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Oscillator), 0); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Oscillator), (const GLvoid*)12); 
glEnableVertexAttribArray(0); // Vertex position 
glEnableVertexAttribArray(2); // normals position 

glGenBuffers(1, &indicesBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * nIndices, indices, GL_DYNAMIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer); 
glBindVertexArray(0); 

然後渲染:

glBindVertexArray(vaoHandle); 
glDrawElements(GL_TRIANGLES, nIndices, GL_UNSIGNED_INT, 0); 
update(time); 

和更新功能:

//some calculations 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Oscillator) * nOscillators, oscillators); 

振盪器 - 它是有一個結構:8分別浮動 - x ,Y,Z(頂點位置)中,nx,NY,NZ(法線),upSpeed,newY

振盪器 - 這是振盪器結構的陣列。

我做錯了什麼?

+0

在您致電更新之前水是否正確渲染? –

+0

在您再次調用draw之前,您是否清除顏色緩衝區/深度緩衝區/ ...? – Felics

+0

是的,水呈現正確,我清除顏色和深度緩衝區。 – Shot

回答

0

在更新數據之前,您必須綁定正確的緩衝區。例如:

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 

既然你是在一次我會建議使用glMapBuffer來更新它

void* data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); 
//[...] update the buffer with new values 
bool done = glUnmapBuffer(GL_ARRAY_BUFFER); 

和修改數據之前,記得要等待(或力)glFlush()更新緩衝區滿你要複製到gl緩衝區。

+0

在修改緩衝區的內容之前,不需要執行'glFlush'。 –