Помощь OpenGL ES2 Vertex Array Objects - PullRequest
1 голос
/ 20 июня 2011

У меня проблемы с пониманием того, как использовать VAO в OpenGL ES2 (на iOS) и заставить их работать. Моя текущая настройка рендеринга выглядит так (в псевдокоде):

Инициализация:

foreach VBO:
    glGenBuffers();

Рендеринг кадра:

// Render VBO 1
glClear(color | depth);
glBindBuffer(GL_ARRAY_BUFFER, arrayVBO1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO1);
foreach vertex attribute:
    glVertexAttribPointer();
    glEnableVertexAttribArray();
glBufferData(GL_ARRAY_BUFFER, ...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLE_STRIP, ...);

// Render VBO 2
glClear(color | depth);
glBindBuffer(GL_ARRAY_BUFFER, arrayVBO2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO2);
foreach vertex attribute:
    glVertexAttribPointer();
    glEnableVertexAttribArray();
glBufferData(GL_ARRAY_BUFFER, ...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLE_STRIP, ...);

Это прекрасно работает, однако, оба VBO имеют одинаковую структуру атрибутов чередующихся вершин, и, как вы можете видеть, я настраиваю и включаю каждый атрибут для каждого кадра для каждого VBO. Инструменты жалуются на избыточные вызовы glVertexAttribPointer () и glEnableVertexAttribArray (), но когда я перемещаю один из них или оба в фазу инициализации, я либо получаю EXC_BAD_ACCESS при вызове glDrawElements, либо ничего не рисуется.

У меня вопрос: нужно ли мне делать это каждый кадр, почему это не работает, если я не работаю, и как я буду использовать VAO для решения этой проблемы.

1 Ответ

0 голосов
/ 19 марта 2012

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

Правильный способ - обновлять буферы только при изменении данных, а не в каждом кадре.В идеале вы должны обновить только ту часть буфера, которая изменилась.Кроме того, указатели атрибутов смещаются в буфер, если буфер связан.

Инициализация:

glGenBuffers()
foreach VBO:
   glBufferData()

Обновления / анимация и т. Д .:

glMapBuffer() //or something like this
buffer->vertex = vec3(1,2,3) // etc
glUnmapBuffer()

И рендеринг:

glBindFBO()
glClear(color | depth);

glBindBuffer(GL_ARRAY_BUFFER, arrayVBO1)
glVertexAttribPointer(GL_VERTEX,..., 0) // Buffer Offset = 0
glVertexAttribPointer(GL_TEXCOORD,..., sizeof(vertex)) // Buffer Offset = size of vertex

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO1);
glEnableVertexAttribArray(..., 0) // Buffer Offset = 0

glBindBuffer(0); // Unbind buffers, you don't need them here
glDrawElements(GL_TRIANGLE_STRIP, ...);

Надеюсь, это поможет.

...