[英]OpenGL buffer update
目前,我正在編寫一個模擬水的程序。 這是我要做的步驟:
然后,我使用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);
- it's a structure that has: 8 floats respectively - x, y, z (vertex position), nx, ny, nz (normals), upSpeed, newY -它具有以下結構:8個浮點數-x,y,z(頂點位置),nx,ny,nz(法線),upSpeed,newY
- this is an array of Oscillator structures. -這是一組振盪器結構。
我做錯了什么?
在更新數據之前,您必須綁定正確的緩沖區。 例如:
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);
請記住,在修改要復制到gl緩沖區的數據之前,請等待(或強制執行)glFlush()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.