我有一个带有 3 个 VBO 的 VAO,其中包含一个带有顶点、法线和纹理坐标的模型。
我打算经常更改这些 VBO 中的所有数据,大约从 500 毫秒到 20 毫秒的更新频率。下载到 VBO 的新模型可以比前一个模型具有更少或更多的三角形。所以缓冲区大小也会改变。
我不是 OpenGL 方面的专家,所以如果可能的话,我想要一些关于如何改进我的代码的提示。目前,该程序实现如下:
glBindVertexArray(*vao);
if (mesh->HasPositions()) {
glBindBuffer(GL_ARRAY_BUFFER, vbo_pos);
glBufferData(
GL_ARRAY_BUFFER,
3 * *point_count * sizeof (GLfloat),
points,
GL_DYNAMIC_DRAW
);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
free(points); // free our temporary memory
}
if (mesh->HasNormals()) {
glBindBuffer(GL_ARRAY_BUFFER, vbo_norm);
glBufferData(
GL_ARRAY_BUFFER,
3 * *point_count * sizeof (GLfloat),
normals,
GL_DYNAMIC_DRAW
);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(2);
free(normals); // free our temporary memory
}
if (mesh->HasTextureCoords(0)) {
glBindBuffer(GL_ARRAY_BUFFER, vbo_tex);
glBufferData(
GL_ARRAY_BUFFER,
2 * *point_count * sizeof (GLfloat),
texcoords,
GL_DYNAMIC_DRAW
);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(1);
free(texcoords); // free our temporary memory
}
编辑:
这个当前的解决方案的问题是绘图不是它应该是的。
如果我的第一个模型很大(50Mb),而我加载另一个更小的模型(25Mb),那么之前模型的一部分仍然被绘制。
如果第一个模型是小模型(25Mb),然后我将其更改为大模型(50Mb),则绘图没有改变(或者至少它似乎没有改变)。如果我在一个更小的(216kb)之后充电,绘图就会改变(但仍然有一部分剩余)。
所以我想我的 VBO 管理有问题吗?