目前我正在编写一个模拟水的程序,以下是我的步骤:
- 创建水面-平面。
- 创建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。
振荡器 - 这是一个振荡器结构的数组。
我做错了什么?
glBufferSubData
之前,您是否绑定了正确的缓冲区? - Andreas Brinck