Введение в OpenGL | страница 4



>void glutDisplayFunc(void (*func) (void))

>void glutReshapeFunc(void (*func) (int width, int height))

>void glutMouseFunc(void (*func) (int button, int state, int x, int y))

>void glutIdleFunc(void (*func) (void))

То есть параметром для них является имя соответствующей функции заданного типа. С помощью glutDisplayFunc() задается функция рисования для окна приложения, которая вызывается при необходимости создания или восстановления изображения. Для явного указания, что окно надо обновить, иногда удобно использовать функцию void glutPostRedisplay(void)

Через glutReshapeFunc() устанавливается функция обработки изменения размеров окна пользователем, которой передаются новые размеры.

glutMouseFunc() определяет обработчика команд от мыши, а glutIdleFunc() задает функцию, которая будет вызываться каждый раз, когда нет событий от пользователя.

Контроль всех событий происходит внутри бесконечного цикла в функции void glutMainLoop(void) которая обычно вызывается в конце любой программы, использующей GLUT.

Структура приложения, использующего анимацию, будет следующей:

>#include

>void MyIdle(void) {

> //--Код, который меняет переменные, определяющие следующий кадр--//

> ....

>};

>void MyDisplay(void) {

> //--Код OpenGL, который отображает кадр --//

> ....

> //-- После рисования переставляем буфера --//

>glutSwapBuffers();

>};

>void main(int argcp, char **argv) {

> //-- Инициализация GLUT --//

> glutInit(&argcp, argv);

> glutInitWindowSize(640, 480);

> glutInitWindowPosition(0, 0);

> //--Открытие окна--//

> glutCreateWindow("My OpenGL Application");

> //-- Выбор режима:Двойной буфер и RGBA цвета --//

> glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

> //-- Регистрация вызываемых функций --//

> glutDisplayFunc(MyDisplay);

> glutIdleFunc(MyIdle);

> //-- Запуск механизма обработки событий --//

> glutMainLoop();

>};

Этот шаблон используется в тексте приложения, использующего OpenGL, который приводится в конце этого пособия.

В случае, если приложение должно строить статичное изображение, можно заменить GLUT_DOUBLE на GLUT_SINGLE, так как одного буфера в этом случае будет достаточно, и убрать вызов функции glutIdleFunc().

Вершины и примитивы

Определение атрибутов вершины

Под вершиной понимается точка в трехмерном пространстве, координаты которой можно задавать следующим образом:

>void glVertex[2 3 4][s i f d](type coords)

>void glVertex[2 3 4][s i f d]v(type *coords)

Координаты точки задаются максимум четырьмя значениями: x, y, z, w, при этом можно указывать два (x,y) или три (x,y,z) значения, а для остальных переменных в этих случаях используются значения по умолчанию: z=0, w=1. Как уже было сказано выше, число в названии команды соответствует числу явно задаваемых значений, а последующий символ - их типу.