Подготовка окна
Подготовку контекста передачи 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;