VAO/VBO管理-更改所有VBO数据
VAO/VBO management - change all VBO data
我有一个带有3个vbo的VAO,包含一个带有顶点,法线和纹理坐标的模型。
我打算经常更改这些vbo中的所有数据,大约从500ms到20ms的更新频率。下载到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管理有问题吗?
我找到问题了
我正在线程中更新vbo数据。我不知道它不工作:/
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- 如何告诉 VBO 处理给定的数据?(布料模拟)
- 将 OpenGL VBO 与自定义类/数据结构一起使用
- 为什么VAO可以使用VBO数据绑定它?
- 确定发送到 VBO 的数据限制
- OpenGL VBO数据似乎已损坏
- VAO/VBO管理-更改所有VBO数据
- 仅修改VBO缓冲区数据的特定元素类型