OpenGL缓冲区更新

时间:2012-12-17 12:08:17

标签: c++ opengl

目前我正在编写一个模拟水的程序。以下是我要做的步骤:

  1. 创建水面 - 平面。
  2. 创建VAO
  3. 创建顶点缓冲区对象,我在其中存储法线和顶点。
  4. 指向此VBO的指针。
  5. 创建索引缓冲区对象。
  6. 然后我使用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

    振荡器 - 这是一系列振荡器结构。

    我做错了什么?

1 个答案:

答案 0 :(得分:0)

在更新数据之前,您必须绑定正确的缓冲区。 E.g:

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()。