В моем коде у меня есть класс Mesh, который является оберткой для базовых функций VAO и VBO. Конструктор принимает массив вершин и индексов и имеет функцию draw().OpenGL есть способ скопировать существующий VAO
Я вызываю функции 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
Чтобы исправить это, в назначении и конструктор копирования я rebuffer данные VBÖ с помощью 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.
Я полностью согласен, и могу сказать, что для своих личных проектов я использую аналогичный шаблон управления ресурсами. Однако я пишу небольшую учебную библиотеку OpenGL, которая будет использоваться (другими) студентами для упрощения их введения в современный OpenGL. Я думал, что было бы более интуитивно, чтобы изолировать сетки как отдельные автономные объекты. Но теперь, когда я думаю об этом, для них, вероятно, было бы более выгодным для меня реализовать простой RM, чтобы подчеркнуть, как правильно использовать VAO/VBO. Благодаря! – kbirk
Я также забыл упомянуть, что я использовал сетки для инкапсуляции предыдущих функций немедленного режима. Таким образом, вы можете создать сетку и использовать аналогичные «begin(), vertex() и end(), что является еще одним аргументом в пользу того, что все ячейки являются отдельными автономными объектами. – kbirk