Я столкнулся с проблемой, заключающейся в том, что загрузка нового содержимого другого размера в буфер приводит к непредсказуемому поведению 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-м шаге)
glDeleteBuffers(1, &_vbo);
glGenBuffers(1, &_vbo);
// glBindBuffer... See step 3
// ...
Это работает.
Можно ли избежать воссозданияновый буфер?Какой предпочтительный способ изменить его размер?
Изменить размер скриншота
Почему он так себя ведет?
Я использую OpenGL версии 4.2.0Сборка 10.18.10.3379