Рисование модели с использованием нескольких VertexBuffers для позиции возможно - PullRequest
0 голосов
/ 19 мая 2011

(я решил попробовать задать этот вопрос по-другому, чтобы возможно продвинуться, как это сделать)

с использованием перечисления 9-4 только в качестве основы в разделе «Рекомендации по работе с данными вершин» Руководства iOS по Apple для OpenGL ES, «Руководство по программированию OpenGL ES для iOS»

Я хочу "добавить" дату позиции в этот буфер. (это можно сделать каким-то образом?)

, а затем просто вызвать какой идентификатор при использовании glDrawElements ...

есть ли способ сделать это? Показан пример того, что я хочу сделать, чтобы дать визуальный.

    typedef struct VertexData3D
    {
        GLfloat position[3];
        GLfloat normal[3];
    } VertexData3D;

    GLuint    test1Buffer;
    GLuint    test2Buffer;
    GLuint    index1Buffer;
    GLuint    index2Buffer;

    const VertexData3D test1Buffer[] = {...};
    const VertexData3D test2Buffer[] = {...};
    const GLushort indices1[] = {...};
    const GLushort indices2[] = {...};

    void CreateBuffers()
    {
    // Static position data
        glGenBuffers(1, &test1Buffer);
        glBindBuffer(GL_ARRAY_BUFFER, test1Buffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(test1VertexData), test1VertexData, GL_STATIC_DRAW);

        glGenBuffers(1, &test2Buffer);
        glBindBuffer(GL_ARRAY_BUFFER, test2Buffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(test2VertexData), test2VertexData, GL_STATIC_DRAW);

    // Static index data
        glGenBuffers(1, &index1Buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index1Buffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices1), indices1, GL_STATIC_DRAW);

        glGenBuffers(1, &index2Buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index2Buffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices2), indices2, GL_STATIC_DRAW);

    glVertexPointer(3, GL_FLOAT, sizeof(VertexData3D), (void*)0);
    glNormalPointer(GL_FLOAT, sizeof(VertexData3D), (void*)12);
    }

// sometimes in the model,  draw out this test1model.
    void DrawModelusingTest1()
    {
    glBindBuffer(GL_ARRAY_BUFFER, test1VertexData);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index1Buffer);

        glDrawElements(GL_TRIANGLES, theNumberInIndex1, GL_UNSIGNED_SHORT, (void*)0);
    }

// sometimes in the model,  draw out this test2model.
   void DrawModelusingTest2()
    {
    glBindBuffer(GL_ARRAY_BUFFER, test2VertexData);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index2Buffer);

        glDrawElements(GL_TRIANGLES, theNumberInIndex2, GL_UNSIGNED_SHORT, (void*)0);
    }

Ответы [ 3 ]

0 голосов
/ 19 мая 2011

Ответ Ротоглупа на мой вопрос здесь может помочь, в частности эта ссылка в отношении методов создания экземпляров.

Я бы просто добавил в список методов использование glVertexAttribDivisor для передачи атрибутов для каждого экземпляра (вместо для каждой вершины) вместо использования однородных буферов.

В основном вы используете один VBO для хранения геометрии и второй для хранения всей моделиМатрицы просмотра для каждого экземпляра.Затем вы используете glVertexAttribDivisor, чтобы указать, что VBO представления модели необходимо продвигать один раз за экземпляр, и вызывать glDrawElementsInstanced один раз, чтобы нарисовать все ваши объекты.

0 голосов
/ 19 мая 2011

Во-первых, ваша трехмерная сетка выглядит действительно статичной, нет необходимости вызывать glGenBuffers для каждого кадра.Делайте это один раз за сетку при инициализации.

Ваш for (int i = 0; i < numOfShapes; i++) не имеет смысла для меня.Вы связываете тонны буферов и вызываете glDrawElements после цикла, что означает, что если я что-то не упустил, то только последние glBindBuffers действительно что-то делают.

Если ВСЕ ваша сцена статична (только камера движется), вы можете создать один огромный VBO (как вы это делали с glGenBuffers), поместить в него все свои данные и вызвать их 4 раза с разными матрицами.

Если что-то динамично И все ваши фигурыпохоже, посмотрите на пример, как предложил Бен Фойгт;но просто избегая перестройки всего, каждый кадр уже должен увеличить ваш fps.

PS У меня нет времени, чтобы полностью прочитать ваш код, но если у вас только один объект повторяется каждый раз, я надеюсь, что вы толькоиметь ОДИН vbo с несколькими вызовами glDrawArrays для одного VBO ...

0 голосов
/ 19 мая 2011

Звучит так, как вы хотели бы glDrawElementsInstanced

...