После этого требуется вызвать функцию ChoosePi xel Format ( hDC, &pf d ), которая на основе характеристики устройства в hDC и требований в pfd возвратит номер стандартного для OpenGL варианта настройки, наиболее близкого к той, что задана структурой pdf.

Нужно создать один или несколько контекстов воспроизведения HGLRC и назначить один из них текущим. Следует напомнить, что при работе с GDI разработчик мог создать много перьев и одно из них занести в контекст hDC. Точно так же при работе с OpenGL надо выбрать в качестве текущего только один из созданных контекстов воспроизведения.

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

Простейшее приложение OpenGL

Листинг 22.2

int StartOpenGLCHWND hWnd.HGLRC *hGLRC) {
HDC hDC - GetDC(hWnd);
PIXELFORMATDESCRIPTOR pfd:
ZeroMemory(&pfd.s i zeof(PIXELFORMATDESCRIPTOR));
pfd.nSize - sizeof(PIXELFORMATDESCRIPTOR):
pfd.nVersion - GL_VERSI0N_1_1;
pfd.dwFlags - PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER:
pfd.iPixel Type - PFD_TYPE_RGBA;.

pfd.cColorBits - 24; //Количество бит на пиксел.

pfd.cDepthBits - 32; //Разрядность Z-буфера.

//ChoosePixelFormat О возвращает в m_Index один из предопределенных

//вариантов

int m_Index - ChoosePixelFormate hDC. &pfd); if(m_Index-0) return -1; //Почему-то система не подобрала вариант if ( Set Pi xel Format ( hDC. m_Index. &pfd)«FALSE) // Устанавливаем return -1; // предложенный формат

*hGLRC - wglCreateContext(hDC); //Создаем контекст воспроизведения wglMakeCurrent(hDC. *hGLRC); //и устанавливаем его как текущий return 0; //Возвращаем признак нормального завершения //Библиотека готова выводить графические примитивы }

В структуре pdf нельзя не заполнить только поле pfd.dwFlags. В нем надо указать, что именно будет поверхностью рисования. Если планируется использовать отображаемую на экран часть видеопамяти (FrontBuffer), то устанавливается флаг PFD__DRAW_TO_WIND0W. Если разработчик собирается рисовать на активной странице (BackBuffer), размещенной в невидимой части видеопамяти, то устанавливается флаг PFD_DOUBLEBUFFER. И наконец, для битовой карты DIB-формата устанавливается флаг PFDJ3RAW_J0_BITMAP. Битовая карта хранится в системной памяти. Поскольку библиотека не может рисовать одновременно в две страницы, то данный флаг несовместим с PFD_DOUBLEBUFFER.


⇐ Предыдущая| |Следующая ⇒