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.


person kbirk    schedule 12.09.2013    source источник


Ответы (1)


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

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

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

person Andon M. Coleman    schedule 12.09.2013
comment
Я полностью согласен и могу сказать, что использую подобный шаблон проектирования управления ресурсами для своих личных проектов. Однако я пишу небольшую учебную библиотеку OpenGL, которая будет использоваться (однокурсниками) для упрощения их знакомства с современным OpenGL. Я подумал, что было бы более интуитивно изолировать сетки как отдельные автономные объекты. Но теперь, когда я думаю об этом, для них, вероятно, было бы более выгодно, чтобы я реализовал простой RM, чтобы подчеркнуть, как правильно использовать VAO/VBO. Спасибо! - person kbirk; 13.09.2013
comment
Я также забыл упомянуть, что использовал сетки для инкапсуляции функциональности предыдущего непосредственного режима. Таким образом, вы могли создать сетку и использовать аналогичные функции begin(), vertex() и end(), что было еще одним аргументом в пользу того, что целые сетки являются отдельными автономными объектами. - person kbirk; 13.09.2013