Подготовка
окна
Подготовку
контекста передачи OpenGL надо рассматривать как некий обязательный ритуал,
в котором порядок действий давно определен и без которого нельзя начинать творческую
работу по созданию сцены OpenGL. Стоит где-то промахнуться, и вы увидите молчаливый
белый экран. Сначала надо подготовить окно так, чтобы вызовы функций OpenGL
начали работать. В этой процедуре выделяют следующие шаги:
- установка стиля окна;
- обработка сообщения WM_ERASEBACKGROUND
и отказ от стирания фона;
- установка pixel-формата;
- создание контекста устройства
(НОС) и контекста передачи (HGLRC);
- специфическая обработка
сообщения WM_SIZE;
- обработка сообщения WM_PAINT;
- освобождение контекстов
при закрытии окна.
Чтобы использовать
функции библиотеки OpenGL в вашем приложении, надо убедиться, что в системном
каталоге Windows присутствуют модули OpenGL32.dll и GLU32.dll. Они должны быть
там, так как компания Silicon Graphics (авторы пакета OpenGL) постаралась, чтобы
поддержка OpenGL на платформе Windows была максимально доступна и достаточно
надежна. Однако хочу предупредить, что я встречал системы, в которых контекст
передачи (rendering context) OpenGL работает ненадежно — появляются пятна пробелов
и задержка перерисовки, если работа идет не в полноэкранном режиме. Если это
есть, то должно проявляться при запуске любой программы, использующей OpenGL.
Причина, видимо, в драйвере видеопамяти.
Типы данных
OpenGL использует
свои собственные типы данных, которые должны соответствовать аналогичным типам
той платформы, на которой библиотека установлена. В Microsoft-реализации соответствие
типов задано в файле заголовков GL.H так, как показано ниже. Эта таблица понадобится
вам при анализе примеров и при разработке собственного кода:
typedef
unsigned int GLenum;
typedef
unsigned char GLboolean;
typedef
unsigned int GLbitfield;
typedef
signed char GLbyte;
typedef
short GLshort;
typedef
int GLint;
typedef
int GLsizei;
typedef
unsigned char GLubyte;
typedef
unsigned short GLushort;
typedef
unsigned int GLuint;
typedef
float GLfloat;
typedef
float GLclampf;
typedef
double GLdouble;
typedef
double GLclampd;
typedef
void GLvoid;