Для моделирования мы создали представление OpenGL1.1 с сеткой из прямоугольников 32 x 48.
Мы рисуем эту сетку каждый раз, когда CADisplayLink вызывает нашу функцию рисования, и позиции вершин никогда не меняются. Единственное, что меняется от кадра к кадру, - это цвет вершины.
Это упрощенный пример того, как мы это делаем:
- (void)drawFrame {
// draw grid
for (int i = 0; i < numRectangles; i++) {
// ... calculate CGPoint values for vertices ...
GLshort vertices[ ] = {
bottomLeft.x, bottomLeft.y,
bottomRight.x, bottomRight.y,
topLeft.x, topLeft.y,
topRight.x, topRight.y
};
glVertexPointer(2, GL_SHORT, 0, vertices);
glColor4f(r, g, b, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
}
Инструмент OpenGL рекомендовал использовать объекты буфера вершин (VBO) для повышения производительности.
Есть ли пример того, как настроить очень простое и простое использование объектов буфера вершин в случае, когда вершины не меняются от кадра к кадру?
Apple предоставляет пример Использование объектов буфера вершин для управления копированием данных вершин, но он неполный.
GLuint vertexBuffer;
GLuint indexBuffer;
void CreateVertexBuffers()
{
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}
Он не показывает, как на самом деле создавать данные. Предыдущий листинг (который должен быть «плохим примером») содержит эти две строки:
const vertexStruct vertices[] = {...};
const GLubyte indices[] = {...};
Итак, эти два массива или структуры должны быть переданы в:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
и
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
?
Является ли iOS предпочтительным форматом «Interleaved (массив структур)», согласно Apple в разделе Use Interleaved Vertex Data section?