В моем коде у меня есть класс Mesh, который является оболочкой для основных функций VAO и VBO. Его конструктор принимает массив вершин и индексов и имеет функцию draw ().
Я вызываю функции glGen * во время его создания и функции glDelete * в его деструкторе.
Понятно, что это оставляет проблемы во время создания назначения / копирования:
Mesh A;
{
Mesh B( myVerts, myIndices );
A = B;
A.draw(); // this works because the VAO and VBOs of B are still around
}
A.draw(); // fails because the destructor of B calls glDelete
Чтобы исправить это, в конструкторе присваивания и копирования я буферизирую данные VBO, используя glMapBuffer:
Mesh& Mesh::operator = ( const Mesh &otherMesh )
{
glGenBuffers( 1, &_vertexBufferObject );
otherMesh.bind();
void *data = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );
bind();
glBufferData(GL_ARRAY_BUFFER, _numBytes, data, GL_STREAM_DRAW);
otherMesh.bind();
glUnmapBuffer(GL_ARRAY_BUFFER);
}
Есть ли способ скопировать состояние VAO из одного VAO в другой. Или я должен повторно вызвать все функции glVertexAttribPointer () и т. Д. Для новой VAO.
Есть ли причина, по которой вы используете сетки в качестве фактического типа для рисования?
Обычно суп из сетки / треугольника будет общим ресурсом, и вы будете создавать его экземпляры для рисования с использованием модели / объекта. Когда вы создаете экземпляр модели / объекта, которому нужна конкретная сетка, вы увеличиваете счетчик ссылок и сохраняете указатель — это управление ресурсами 101 в скорлупе ореха.
Называйте их как хотите, я думаю, вы не правильно различаете место хранения данных и интерфейс, необходимый для их визуализации. Вам не нужно VAO для каждого экземпляра объекта, и удаление VAO / VBO должно происходить только после того, как ничто больше не ссылается на данные вершины.
Других решений пока нет …