2013-09-12 5 views
0

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

ответ

2

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

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

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

+0

Я полностью согласен, и могу сказать, что для своих личных проектов я использую аналогичный шаблон управления ресурсами. Однако я пишу небольшую учебную библиотеку OpenGL, которая будет использоваться (другими) студентами для упрощения их введения в современный OpenGL. Я думал, что было бы более интуитивно, чтобы изолировать сетки как отдельные автономные объекты. Но теперь, когда я думаю об этом, для них, вероятно, было бы более выгодным для меня реализовать простой RM, чтобы подчеркнуть, как правильно использовать VAO/VBO. Благодаря! – kbirk

+0

Я также забыл упомянуть, что я использовал сетки для инкапсуляции предыдущих функций немедленного режима. Таким образом, вы можете создать сетку и использовать аналогичные «begin(), vertex() и end(), что является еще одним аргументом в пользу того, что все ячейки являются отдельными автономными объектами. – kbirk

Смежные вопросы