OpenGL есть способ скопировать существующий VAO

В моем коде у меня есть класс 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.

0

Решение

Есть ли причина, по которой вы используете сетки в качестве фактического типа для рисования?

Обычно суп из сетки / треугольника будет общим ресурсом, и вы будете создавать его экземпляры для рисования с использованием модели / объекта. Когда вы создаете экземпляр модели / объекта, которому нужна конкретная сетка, вы увеличиваете счетчик ссылок и сохраняете указатель — это управление ресурсами 101 в скорлупе ореха.

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

2

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

Других решений пока нет …

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