Использование списков
С кубиком быстро расправляется любой компьютер и видеокарта, а вот с более сложными объектами могут возникнуть затруднения, бороться с которыми можно с помощью нескольких приемов. Один из них – использование заранее откомпилированных списков команд 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); <strong>//======</strong> Готовим сцену DrawScene (); }