Ошибка с glGenVertexArrays и glGenVertexBuffers при рисовании нескольких кубов

Я написал небольшую программу, которая должна отображать несколько кубов с OpenGL 4.3. Я использую SDL 2.0 для создания контекста, но я не думаю, что моя проблема исходит оттуда.

У меня есть класс Cube который имеет несколько атрибутов, в том числе GLuint m_vao для массива вершин и GLuint m_vbo для буфера вершин.

Чтобы отобразить несколько кубов, я создаю несколько экземпляров этого класса с разными координатами. я использую glGenVertexArrays(1, &m_vao) а также glGenBuffers(1, &m_vbo) в конструкторе Cube,

У меня нет проблем при создании таких кубов:

Cube c(-4, 0, -4, "texture.jpg");
Cube c2(4, 0, 2, "texture.jpg");
Cube c3(2, 1, 2, "texture.jpg");
Cube c4(-2, 1, 2, "texture.jpg");

Это создает четыре куба с уникальным m_vao а также m_vbo атрибуты (1 для с, 2 для с2, 3 для с3 и 4 для с4).

Тем не менее, когда я создаю свои кубы, как это:

std::vector<std::vector<Cube>> cubes;
for (int i = 0; i < 9; i++) {
cubes.push_back(std::vector<Cube>());
for (int j = 0; j < 9; j++) {
Cube temp = Cube(i, 0, j, "texture.jpg");
cubes[i].push_back(temp);
}
}

Все кубики внутри моего vector имеют те же m_vao а также m_vbo атрибуты, в этом случае все они имеют 1 как m_vao а также m_vbo, Если я сделаю это после создания кубов c, c2, c3 и c4 вручную, они получат 4.
Конечно, поскольку все они используют один и тот же VBO, они имеют одинаковые координаты, и в конце появляется только один куб.

Итак, мой вопрос: что отличается между созданием кубов вручную (что прекрасно работает) и созданием их внутри std::vector с for цикл (который генерирует одинаковые VAO и VBO для всех кубов)?

1

Решение

Я предполагаю, что вы вызываете glDeleteBuffers в деструкторе? При вставке временного куба в вектор, temp :: ~ Cube () вызывается, когда temp выходит из контекста, что освобождает буферы. Следующий куб получит уже освобожденный идентификатор.

for (int j = 0; j < 9; j++)
{

// Calls Cube(...)
Cube temp = Cube(i, 0, j, "texture.jpg");

// Copies or movies temp into the vector
// In cases where cubes has to resize, also Cube::~Cube() is called
cubes[i].push_back(temp);

// temp goes here out of scope so temp::~Cube() is called
}
1

Другие решения


По вопросам рекламы [email protected]