我遇到了一个问题,就是将不同大小的新内容上传到缓冲区,会导致VAO的行为难以预料。导致我的对象看起来好像缓冲区大小设置得不正确。
1)我为对象生成VAO和VBO
glGenVertexArrays(1, &_vao); // Generate 1 VAO
glGenBuffers(1, &_vbo); // Generate 1 VBO2)获得均匀变量和属性的位置。
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 VBO4)然后加载我的数据:
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构建10.18.10.3379
发布于 2018-05-26 22:16:57
什么是比较喜欢的调整大小的方式?
调整缓冲区对象大小的首选方法是不调整它们的大小。我是认真的。
OpenGL ARB创建了一个为缓冲区分配存储的整个替代方式,唯一的目的是以后不可能重新分配它们。好的,如果您想要具有技术性,不可变存储的目的是允许持久化映射,这需要不可变,但是如果他们只是想要持久映射缓冲区,他们可以将新的API限制在那些。
找出您的数据的最大大小(或您想要支持的最大值),预先分配它,以及任何您想要的部分。
从技术上讲,你的代码应该有效。按照标准,如果调整缓冲区对象的大小,引用的对象应该能够看到大小调整的存储。但是由于实现不希望您调整它们的大小,所以高性能的应用程序不会调整它们的大小。因此,该代码很少在实际应用程序中进行测试,而且bug可能会持续很长一段时间。
别这么做。
https://stackoverflow.com/questions/50547217
复制相似问题