Особенности использования OpenGL в Windows
OpenGL представляет собой универсальную графическую библиотеку, которая может быть реализована в любой оконной среде. Поставляется в составе операционной системы Windows, начиная с версии OSR2 в виде двух DLL-файлов – opengl32.dll и glu32.dll. Первая из этих библиотек и есть собственно набор функций OpenGL, вторая содержит дополнительный набор функций, упрощающих кодирование, но построенных и выполняемых с подключением opengl32.dll, и является надстройкой.
То, что эти библиотеки поставляются в составе операционной системы, значительно упрощает распространение разработанных приложений. То, что OpenGL распространяется в виде динамических библиотек, упрощает доступ к его функциям.
Для работы с OpenGL в Windows используется понятие контекста воспроизведения (rendering context), который связывает OpenGL с оконной системой Windows. Если обычный контекст устройства (device context) содержит информацию, относящуюся к графическим компонентам GDI, то контекст воспроизведения содержит информацию, относящуюся к OpenGL.
Таким образом, чтобы начать работать с командами OpenGL, приложение должно создать, как минимум, один контекст воспроизведения и сделать его текущим.
Перед созданием контекста воспроизведения необходимо установить формат пикселей. Для установки формата пикселей используется функция Windows GDI int ChoosePixelFormat(HDC, const PIXELFORMATDESCRIPTOR), выбирающая наиболее подходящий формат исходя из информации, переданной в полях структуры PIXELFORMATDESCRIPTOR.
После того как найден подходящий формат пикселей, следует установить его в контексте устройства при помощи функции BOOL SetPixelFormat(HDC hDC, inl pixelFormat, const PIXELFORMATDESCRIPTOR).
Для работы с контекстом воспроизведения в Windows существуют функции HGLRC wglCreateContext(HDC hDC) и BOOL wglMakeCurrent(HDC hDC, HGLRC hGLRC).
Первая из них создаёт новый контекст воспроизведения OpenGL, который подходит для рисования на устройстве, задаваемом контекстом hDC. Вторая функция устанавливает текущий контекст воспроизведения.
По окончании работы с OpenGL созданный контекст воспроизведения необходимо удалить. Для этого существует функция BOOL wglDeleteContext(HGLRC hGLRC).
Текущий контекст воспроизведения можно узнать при помощи функции HGLRC wglGetCurrentContext().
При помощи OpenGL можно создавать анимации. При этом для изображения используется режим работы с двумя буферами, когда содержимое одного из них показывается, а в другом осуществляется построение. После окончания построения специальная команда меняет буферы местами (по аналогии с двухстраничным режимом работы). Для использования двойной буферизации необходимо установить флаг PFD_DOUBLE_BUFFER при задании формата пикселей и применить команду SwapBuffers, меняющую буферы местами (по умолчанию вывод происходит в невидимый буфер).
Основные типы данных
Все команды (процедуры и функции) OpenGL начинаются с префикса gl, а все константы – с префикса GL_. Кроме того, в имена функций и процедур OpenGL входят суффиксы, несущие информацию о числе передаваемых параметров и о их типе. В табл. 1 приводятся вводимые OpenGL типы данных, стандартные типы языка C и суффиксы, которым они соответствуют.
Таблица 1
Типы данных OpenGL
Суффикс | Описание | Тип в C | Тип в OpenGL |
b | 8-битовое целое | char | GLbyte |
s | 16-битовое целое | short | GLshort |
i | 32-битовое целое | long | GLint GLsizei |
f | 32-битовое вещественное число | float | GLfloat, GLclampf |
d | 64-битовое вещественное число | double | GLdouble, GLclampd |
ub | 8-битовое беззнаковое целое | unsigned char | GLubyte, GLboolean |
us | 16-битовое беззнаковое целое | unsigned short | GLushort |
ui | 32-битовое беззнаковое целое | unsigned long | GLuint, GLenum, GLbitfield |
void | GLvoid |
Некоторые команды OpenGL оканчиваются на букву v. Это говорит о том, что команда получает указатель на массив значений, а не сами эти значения в виде отдельных параметров. Многие команды имеют как векторные, так и не векторные версии. Например, конструкции
glColor3f(1.0, 1.0, 1.0);
и
GLfloat color[] = {1.0, 1.0, 1.0};
glColor3fv(color);
эквивалентны.
OpenGL можно рассматривать как автомат, находящийся в одном из нескольких состояний. Внутри OpenGL содержится целый ряд переменных, например, текущий цвет или текущий режим закрашивания. Если установить текущий цвет, то все последующие объекты будут этого цвета до тех пор, пока текущий цвет не будет изменён.
По умолчанию каждая системная переменная имеет своё значение, и в любой момент значение каждой из этих переменных можно узнать. Обычно для этого используется одна из следующих функций: glGetBooleanv(), glGetDoublev(), glGetFloatv() и glGetIntegerv(). Для определения значений некоторых переменных служат специальные функции.
OpenGL предоставляет пользователю достаточно мощный, но низкоуровневый набор команд, и все операции высокого уровня должны выполняться в терминах этих команд. Обычно для облегчения работы вместе с OpenGL поставляется библиотека дополнительных команд, каждая из которых начинается с префикса glu. Далее будет рассмотрена часть из этих команд.