У меня есть код OpenGL, но я пытаюсь немного улучшить его производительность (хотел бы немного увеличить частоту кадров на старых устройствах). Я пытаюсь сделать это с помощью Vertex Buffer Object.Рисование с объектами буфера вершин в OpenGL ES 1.1 не работает
Весь мой код делает нарисовать серию из 360 GL_TRIANGLES, которые имеют текстуру, применяемую к ним. Я переплетаю координаты и координаты текстуры в структуру данных.
typedef struct {
GLfloat vertex[2];
GLfloat texture[2];
GLfloat padding[4];
} TextureVertex2D;
typedef struct {
TextureVertex2D textureVertex[3];
} TextureTriangle2D;
Вот соответствующая часть моей инициализации
textureTriangles = (TextureTriangle2D*)malloc(360 * sizeof(TextureTriangle2D));
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
// This section is the only new code introduced for the VBOs.
glGenBuffers(1, &buffer[0]);
glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(TextureTriangle2D)*360, textureTriangles[0].textureVertex[0].vertex, GL_DYNAMIC_DRAW);
// end new code
glVertexPointer(2, GL_FLOAT, sizeof(TextureVertex2D), textureTriangles[0].textureVertex[0].vertex);
glTexCoordPointer(2, GL_FLOAT, sizeof(TextureVertex2D), textureTriangles[0].textureVertex[0].texture);
/*
textureTriangles is filled and the texture image is loaded in
*/
Для экономии до фактического VBO, я попробовал два метода (оба из которых имели один и тот же результат)
// Option 1
GLvoid* vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
memcpy(vbo_buffer, textureTriangles[0].textureVertex[0].vertex, 360 * sizeof(TextureTriangle2D));
glUnmapBufferOES(GL_ARRAY_BUFFER);
// Option 2
glBufferSubData(GL_ARRAY_BUFFER, sizeof(TextureVertex2D), 360 * sizeof(TextureTriangle2D), textureTriangles[0].textureVertex[0].vertex);
Затем я связываю буфер
glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
И, наконец, выполнить чертеж
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3*360);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
без РВО, рисунок прекрасно работает. После того, как я добавлю код VBO выше, рисунок больше не находится в нужном месте (смещение на несколько пикселей), и он блокирует все мое приложение. Есть идеи?
В файле 'glBufferSubData' второй аргумент должен be '0' вместо' sizeof (TextureVertex2D) '. Однако при обновлении всего буфера вы должны использовать 'glBufferData'. –