首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VAO/VBO管理-更改所有VBO数据

VAO/VBO管理-更改所有VBO数据
EN

Stack Overflow用户
提问于 2014-06-18 18:50:02
回答 1查看 542关注 0票数 0

我有一个带有3个VAO的VAO,包含一个带有顶点、法线和纹理坐标的模型。

我打算经常更改这些VBO中的所有数据,大致从500毫秒到20毫秒的更新频率。下载到VBO的新模型可以比以前的模型具有更少或更多的三角形。所以缓冲区的大小也会改变。

我不是OpenGL专家,所以如果可能的话,我想要一些关于如何改进我的代码的提示。目前,该程序的实现方式如下:

代码语言:javascript
复制
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管理出了什么问题?

EN

回答 1

Stack Overflow用户

发布于 2014-06-19 15:12:54

好的,我找到问题了

我在一个线程中更新vbo数据。我不知道它不工作:/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24283614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档