Использование так называемых массивов вершин, вероятно, является самым верным способом оптимизации такой сцены.Вот хороший учебник:
http://www.songho.ca/opengl/gl_vertexarray.html
Массив вершин или, в более общем смысле, массив данных gl содержит такие данные, как положения вершин, нормали, цвета.У вас также может быть массив, содержащий индексы для этих буферов, чтобы указать, в каком порядке их рисовать.
Затем у вас есть несколько тесно связанных функций, которые управляют этими массивами, распределяют их, задают им данные и рисуют их.Вы можете выполнить рендеринг сложной сетки с помощью одной команды OpenGL, например glDrawElements()
. Эти массивы обычно находятся в памяти хоста. Дальнейшая оптимизация заключается в использовании объектов буфера вершин, которые имеют ту же концепцию, что и обычнаямассивы, но находятся в памяти графического процессора и могут быть несколько быстрее.Вот немного об этом:
http://www.songho.ca/opengl/gl_vbo.html
Работа с буферами по сравнению со старым добрым glBegin() .. glEnd()
имеет преимущество совместимости с OpenGL ES.в OpenGL ES массивы и буферы - единственный способ рисовать вещи.
--- РЕДАКТИРОВАТЬ
Перемещение, вращение и преобразование объектов в сцене сделаноиспользование матрицы просмотра модели и не требует каких-либо изменений в данных сетки.Для иллюстрации:
у вас есть инициализация:
void initGL() {
// create set of arrays to draw a player
// set data in them
// create set of arrays for ball
// set data in them
}
void drawScene {
glMatrixMode(GL_MODEL_VIEW);
glLoadIdentity();
// set up view transformation
gluLookAt(...);
drawPlayingField();
glPushMatrix();
glTranslate( player 1 position );
drawPlayer();
glPopMatrix();
glPushMatrix();
glTranslate( player 2 position );
drawPlayer();
glPopMatrix();
glPushMatix();
glTranslate( ball position );
glRotate( ball rotation );
drawBall();
glPopMatrix();
}