目前我正在編寫一個模擬水的程序。以下是我的步驟:OpenGL緩衝區更新
- 創建水面 - 飛機。
- 創建VAO
- 創建頂點緩衝區對象,其中存儲法線和頂點。
- 綁定指向此VBO的指針。
- 創建索引緩衝區對象。
然後我使用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
振盪器 - 這是振盪器結構的陣列。
我做錯了什麼?
在您致電更新之前水是否正確渲染? –
在您再次調用draw之前,您是否清除顏色緩衝區/深度緩衝區/ ...? – Felics
是的,水呈現正確,我清除顏色和深度緩衝區。 – Shot