Невозможно создать более одного VAO

Я пытаюсь создать простую графическую систему с использованием современного (3.3) OpenGL для использования в игре. Динамические объекты будут иметь динамическую геометрию, а VBO будут обновляться при каждом изменении. Эта часть была очень проста в реализации. Хотя все работает хорошо, пока используется только один VAO, дальнейшие вызовы glGenVertexArrays не создают другого объекта (печать идентификатора для первого и второго возвращают 1), и что-то в инициализации VAO для новых объектов делает первый один не может выполнить какие-либо правки. Каждое "современное OpenGL" руководство использует только один объект или имеет довольно серьезные конфликты (чаще всего используется glVertexAttribPointer). Следующий код связан с графической системой объектов. (Не знаю, насколько это важно, но я использую glfw3 для создания окон и контекстов).

Init Game Object (графический фрагмент)

glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);
glGenBuffers(1, &vertexCoordBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
glBufferData(GL_ARRAY_BUFFER, 2000 * 3 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);
allocatedVerticies = 2000;

Обновить сетку

    //generate mesh
std::vector<float> vertices;
vertices.reserve(voxels.size() * 3 * 12);

//Vertices are added to the vector. This part works. Removed this code for clarity.


vertexCount = vertices.size() / 3;
glBindVertexArray(vertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
    //reallocate the buffers
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    allocatedVerticies = vertexCount;
}
else
{
    /////////////////////////////
    //reallocate the buffers- originally a reallocation was not going to be used, but glBufferSubData does not work
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    allocatedVerticies = vertexCount;


    ////////////////////////////////////////this does not work for some reason
    //reset data
    //glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(float), vertices.data());
}
edited = false;

Render Object

glBindVertexArray(vertexArrayID);
glDrawArrays(GL_TRIANGLES, 0, vertexCount);

Если бы кто-то более опытный с OpenGL мог указать на мою ошибку (или другую проблему), это было бы фантастически.

1 ответ

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

Кстати: если вы уже определились glVertexAttribPointer() для вашего buffor вам не нужно делать это каждый раз, когда вы обновляете данные, которые вы сохранили в vertexCoordBufferID если, конечно, вы не измените расположение данных и их тип. Вместо:

vertexCount = vertices.size() / 3;
glBindVertexArray(vertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
    //reallocate the buffers
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    allocatedVerticies = vertexCount;
}

Вы можете использовать только:

vertexCount = vertices.size() / 3;
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
    //reallocate the buffers
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    allocatedVerticies = vertexCount;
}
Другие вопросы по тегам