OpenGL VAO VBO изменить размер - PullRequest
0 голосов
/ 27 мая 2018

Я столкнулся с проблемой, заключающейся в том, что загрузка нового содержимого другого размера в буфер приводит к непредсказуемому поведению 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

1 Ответ

0 голосов
/ 27 мая 2018

Какой предпочтительный способ изменить его размер?

Предпочтительным способом изменения размера буферных объектов является , а не изменение их размера .Я серьезно.

ARB OpenGL создал альтернативный способ выделения памяти для буферов , с единственной целью 1012 *, чтобы сделать невозможным их перераспределение позже,Хорошо, если вы хотите быть техническим, цель неизменного хранилища состоит в том, чтобы разрешить постоянное отображение, которое требует неизменности, но если бы они просто хотели постоянные отображенные буферы, они могли бы ограничить новый API только этими.

Выясните, какой будет максимальный размер ваших данных (или какой бы максимальный размер вы не хотели поддерживать), выделите их заранее и просто любую часть, которую вы хотите.


Технически, ваш код должен работать,По стандарту, если вы изменяете размер буферного объекта, вещи, которые ссылаются на него, должны иметь возможность видеть измененное хранилище.Но поскольку реализации не хотят, чтобы вы меняли их размер, высокопроизводительные приложения не меняют их.Так что этот код редко тестируется в реальных приложениях, и ошибки могут продолжаться довольно долго.

Просто не делайте этого.

...