Использование
списков
С кубиком быстро
расправляется любой компьютер и видеокарта, а вот с более сложными объектами
могут возникнуть затруднения, бороться с которыми можно с помощью нескольких
приемов. Один из них — использование заранее откомпилированных списков команд
OpenGL. Для иллюстрации этого приема создайте отдельную глобальную функцию:
void
DrawScene()
{
//
======
Создаем новый список команд OpenGL
glNewList(I,GL_COMPILE);
//======
Сюда поместите код, рисующий куб,
//======
начиная со строки
static
float v[8][3] =
//======
и заканчивая
for
(
int
j = 0; j < 4; j++)
glVertex3fv(v[id[i] [j] ] ) ;
}
glEnd() ;
glEndList () ;
}
Список рисующих
команд OpenGL ограничивается операторными скобками вида:
glNewList(I,
GL_COMPILE);
//======
Здесь располагаются команды OpenGL
glEndList
() ;
Первый параметр
glNewList (типа GLuint) идентифицирует список с тем, чтобы разработчик мог одновременно
использовать несколько списков и вызывать их в нужные моменты времени по номеру.
Вызов нашего (единственного) списка мы будем производить командой glCallList(l);.
Команды, расположенные между строками giNewList(l, GL_COMPILE); и glEndListQ;,
будут откомпилированы и сохранены в списке номер один. В функции перерисовки
их следует просто воспроизвести. Для этого замените существующую версию функции
OnDraw на новую:
void _stdcall OnDraw()
{
glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT);
glMatrixMode
(GL_MODELVIEW);
glLoadldentity
();
glTranslated(gdTransX,
gdTransY, gdTransZ);
glRotated(gdAngleY,
0.,1.,0.);
glRotated(gdAngleX,
1. ,0 .,0 .);
//======
Воспроизводим команды из списка 1
glCallList
(1);
auxSwapBuffers();
}
Вызов DrawScene
можно осуществить внутри функции initQ, то есть один раз за время существования
программного модуля:
void Init ()
{
glClearColor
(
1., 1., 1., 0.);
//======
Включаем интерполяцию цветов полигона
glShadeModel
(GL_SMOOTH);
glShadeModel
(GL_DEPTH_TEST) ;
glPolygonMode(GL_FRONT_AND_BACK,
GL_FILL),
glEnable(GL_LIGHTING);
glEnable(GL_LIGHTO);
glEnable(GL_COLOR_MATERIAL);
//======
Готовим сцену
DrawScene
() ;
}