我有一个带有3个VAO的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管理出了什么问题?
发布于 2014-06-19 15:12:54
好的,我找到问题了
我在一个线程中更新vbo数据。我不知道它不工作:/
https://stackoverflow.com/questions/24283614
复制相似问题