【发布时间】:2018-11-05 22:00:15
【问题描述】:
我遇到了一个问题,将不同大小的新内容上传到缓冲区会导致 VAO 行为异常。导致我的对象看起来好像缓冲区大小设置不正确。
1) 我为一个对象生成 VAO 和 VBO
glGenVertexArrays(1, &_vao); // Generate 1 VAO
glGenBuffers(1, &_vbo); // Generate 1 VBO
2) 获取统一变量和属性的位置
3) 像这样设置绑定:
glBindBuffer(GL_ARRAY_BUFFER, _vbo); // Bind VBO first
glBindVertexArray(_vao); // Bind VAO properties to VBO
{
GLsizei packSize = DIM * sizeof(GLfloat) * 2;
glEnableVertexAttribArray(_position);
glVertexAttribPointer(_position, DIM, GL_FLOAT, GL_FALSE, packSize, (GLvoid*)0);
// And so on ...
}
glBindVertexArray(0); // Unbind VAO
glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBO
4) 然后我加载我的数据:
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBufferData(GL_ARRAY_BUFFER, _vertices.size() * sizeof(float),
_vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
问题在我尝试加载不同大小的新数据时开始:
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBufferData(GL_ARRAY_BUFFER, _vertices.size() * sizeof(float),
_vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
而且我的缓冲区大小似乎保持不变。
不过,如果我再次定义并将我的 vao 绑定到 vbo(如在 3-d 步骤中)
glDeleteBuffers(1, &_vbo);
glGenBuffers(1, &_vbo);
// glBindBuffer... See step 3
// ...
有效。
是否可以避免重新创建新缓冲区? 调整大小的首选方式是什么?
为什么会这样?
我使用 OpenGL 版本 4.2.0 Build 10.18.10.3379
【问题讨论】:
-
我需要上传更多顶点到缓冲区。如果我调用
glBufferData,它只会绘制部分顶点,因为缓冲区大小保持不变 -
我附上了截图。任何想法为什么它可能会出错?
-
也许我需要以某种方式更新 VAO?