Читать «Введение в OpenGL» онлайн - страница 3

Автор неизвестен

glutInitWindowPosition(int x, int y)

glutInitWindowSize(int width, int height)

glutInitDisplayMode(unsigned int mode)

Первые две функции задают соответственно положение и размер окна, а последняя функция определяет различные режимы отображения информации, которые могут совместно задаваться с использованием операции побитового “или”(|):

GLUT_RGBA Режим RGBA. Используется по умолчанию, если не указаны явно режимы GLUT_RGBA или GLUT_INDEX.

GLUT_RGB То же, что и GLUT_RGBA.

GLUT_INDEX Режим индексированных цветов (использование палитры). Отменяет GLUT_RGBA.

GLUT_SINGLE Окно с одиночным буфером. Используется по умолчанию.

GLUT_DOUBLE Окно с двойным буфером. Отменяет GLUT_SINGLE.

GLUT_DEPTH Окно с буфером глубины.

Это неполный список параметров для данной функции, однако для большинства случаев этого бывает достаточно.

Двойной буфер обычно используют для анимации, сначала рисуя что-нибудь в одном буфере, а затем меняя их местами, что позволяет избежать мерцания. Буфер глубины или z-буфер используется для удаления невидимых линий и поверхностей.

Функции библиотеки GLUT реализуют так называемый событийно-управляемый механизм. Это означает, что есть некоторый внутренний цикл, который запускается после соответствующей инициализации и обрабатывает, одно за другим, все события, объявленные во время инициализации. К событиям относятся: щелчок мыши, закрытие окна, изменение свойств окна, передвижение курсора, нажатие клавиши, и "пустое" (idle) событие, когда ничего не происходит. Для проведения периодической проверки совершения того или иного события надо зарегистрировать функцию, которая будет его обрабатывать. Для этого используются функции вида:

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 <GL/glut.h>

void MyIdle(void) {

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

 ....

};

void MyDisplay(void) {

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

 ....