Иллюстрированный самоучитель по Visual Studio.Net

         

Использование списков


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

}



Содержание раздела