Введение в Opengl 1 1 Что такое OpenGL? 1 2 Немного Opengl кода 2 3 Синтаксис команд Opengl 4



бет5/6
Дата29.05.2016
өлшемі222 Kb.
#100722
түріГлава
1   2   3   4   5   6

1.9 GLUT


Как вы уже знаете, OpenGL содержит набор команд, но разработана как независимая от оконной или операционной системы. Как следствие, в ней нет команд для открытия окон или чтения событий от клавиатуры или мыши. К несчастью нельзя создать полноценное приложение без того, чтобы, как минимум, открыть окно, а наиболее интересные приложения требуют взаимодействия с пользователем посредством устройств ввода или используют иные средства операционной или оконной системы. Во многих случаях завершенные программы представляют собой наиболее интересные примеры, поэтому мы будем использовать GLUT для упрощения открытия окон, захвата пользовательского ввода и так далее. Если у вас имеется реализация OpenGL и GLUT для вашей системы, все примеры будут работать без изменений (или почти без изменений).

Кроме того, в отличие от OpenGL, чьи команды ограничены рисованием примитивов, GLUT содержит функции для рисования более сложных трехмерных объектов, таких как сфера, куб, торус (бублик) и чайник. (Обратите внимание на то, что GLU также содержит функции для рисования этих объектов, а также цилиндров, конусов и многого другого.)



Библиотеки GLUT может быть недостаточно для построения полномасштабного OpenGL приложения (например, в силу отсутствия полного контроля над форматом пикселей или созданием контекста OpenGL), но это хорошая начальная точка для изучения OpenGL. Остальная часть данного раздела посвящена наиболее часто применяемым группам функций GLUT. Функции неуказанные здесь, рассмотрены в приложении A данного пособия.

1.9.1 Управление окном


void glutInit (int argc, char **argv);

glutInit() должна быть вызвана до любых других GLUT – функций, так как она инициализирует саму библиотеку GLUT. glutInit() также обрабатывает параметры командной строки, но сами параметры зависят от конкретной оконной системы. Для системы X Window, примерами могут быть –iconic, -geometry и –display. (Параметры, передаваемые glutInit(), должны быть теми же самыми, что и параметры, передаваемые в функцию main()).

void glutInitDisplayMode (unsigned int mode);

Указывает режим отображения (например, RGBA или индексный, одинарной или двойной буферизации) для окон, создаваемых вызовами glutCreateWindow(). Вы также можете указывать, имеет ли окно ассоциированные с ним буфер или буферы глубины, трафарета и аккумуляции. Аргумент mask – это битовая комбинация, полученная при помощи операции OR и следующих констант: GLUT_RGBA или GLUT_INDEX (для указания цветового режима), GLUT_SINGLE или GLUT_DOUBLE (для указания режима буферизации), а также константы для включения различных буферов GLUT_DEPTH, GLUT_STENCIL, GLUT_ACCUN. Например, для окна с двойной буферизаций, RGBA – цветовым режимом и ассоциированными буферами глубины и трафарета, используйте GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL. Значение по умолчанию – GLUT_RGBA | GLUT_ SINGLE (окно с однократной буферизацией в RGBA - режиме).

void glutInitWindowSize (int width, int height);
void glutInitWindowPosition (int x, int y);

Запрашивают окно определенного размера и в определенном месте экрана соответственно. Аргументы (x, y) определяют, где будет находиться угол окна относительно всего экрана. width и height определяют размер окна (в пикселях). Начальные размеры и место размещения окна могут быть перекрыты последующими вызовами.

int glutCreateWindow (char *name);

Открывает окно с предварительно установленными характеристиками (режимом отображения, размером и так далее). Строка name может быть отображена в заголовке окна, но это зависит от конкретной оконной системы. Окно не отображается до того, как произведен вход в glutMainLoop(), поэтому до вызова этой функции нельзя рисовать что-либо в окно.
Возвращаемая целая величина представляет собой уникальный идентификатор окна. Этот идентификатор может быть использован для управления несколькими окнами в одном приложении (каждое со своим контекстом OpenGL) и рисования в них.

1.9.2 Функции управления событиями


После того, как окно создано, но до входа в главный цикл программы, вы должны зарегистрировать функции обратного вызова, используя следующие функции GLUT.

void glutDisplayFunc (void (*func)(void));

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

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

Позволяет указать функцию, которая вызывается каждый раз при изменении размера окна или его позиции на экране. Аргумент func – это указатель на функцию, которая принимает два параметра: width – новая ширина окна и height – новая высота окна. Обычно func вызывает glViewport() для отсечения графического вывода по новым размерам окна, а также настраивает проекционную матрицу для сохранения пропорций спроецированного изображения в соответствии с новыми размерами порта просмотра. Если glutReshapeFunc() не вызывается или ей передается NULL (для отмены регистрации функции обратного вызова), вызывается функция изменения метрик по умолчанию, которая вызывает glViewport (0,0,width,height).

void glutKeyboardFunc (void (*func)(unsigned int key, int x, int y));

Задает функцию func, которая вызывается, когда нажимается клавиша, имеющая ASCII-код. Этот код передается функции обратного вызова в параметре key. В параметрах x и y передается позиция курсора мыши (относительно окна) в момент нажатия клавиши.

void glutMouseFunc (void (*func)(int button, int state, int width, int height));

Указывает функцию, которая вызывается при нажатии или отпускании кнопки мыши. Параметр button может иметь значения GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON или GLUT_RIGHT_BUTTON. Параметр state может иметь значения GLUT_UP или GLUT_DOWN в зависимости от того отпущена или нажата кнопка мыши. В параметрах x и y передаются координаты курсора мыши (относительно окна) в момент наступления события.

void glutMotionFunc (void (*func)(int x, int y));

Указывает функцию, которая будет вызываться при движении мыши внутри окна в то время, как на ней нажата одна или несколько клавиш. В параметрах x и y передаются координаты курсора мыши (относительно окна) в текущий момент.

void glutPostRedisplay (void);

Помечает, что текущее окно требует перерисовки. После этого при любой возможности будет вызвана функция перерисовки окна, зарегистрированная вызовом glutDisplayFunc().


Достарыңызбен бөлісу:
1   2   3   4   5   6




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет