wc.style=CS_HREDRAW|CS_VREDRAW|CSJDWNDC; wc.lpfnWndProc=(WNDPROC)WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0 ;
wc. hInstance=GetModuleHandle(NULL) ;
wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=NULL;
wc.lpszMenuName=NULL;
wc.IpszClassName="OpenGL" ;
return RegisterClass(Swc);
}
HWND makewin(char* title) // создание окна {
return CreateWindowEx(0,"OpenGL",title, WS_CLIPSIBLINGS IWS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW,
0,0,width,height,NULL,NULL,GetModuleHandle(NULL) , NULL);
// оконная процедура
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,
WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY: // уничтожение окна // освобождение ресурсов примера example_deinit();
PostQuitMessage(0); break;
case WM_SIZE: // изменение размера окна gl.resize(); break;
// ввод с клавиатуры
case WM_KEYDOWN:case WM_CHAR:case WM_KEYUP: in.keyinput(wParam,lParam, uMsg) ; break;
// ввод от мыши
case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: in.keyinput(wParam,lParam,uMsg); break;
case WM_MOUSEMOVE: // движение мыши in.keyinput(wParam,lParam,uMsg); break; default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
Для подсоединения OpenGL к созданному окну необходимо выполнить несколько действий. Первое - это заполнить структуру, описывающую формат пикселя. На этом этапе нужно определиться, какие опции OpenGI необходимы программе, хотим ли мы работать в индексном режиме, разрядность дополнительных буферов и т. д. Затем данные структуры передаются контексту устройства окна. Это можно сделать только один раз для каждого окна. И наконец, создать контекст отображения OpenGI и сделать его текущим. После завершения работы с OpenGI контекст отображения уничтожается. Вышесказанное реализовано в классе GLmain в функциях членах init и deinit. Дополнительные настройка OpenGL как областей видимости и тип проекции устанавливаются функцией членом set.
Далее приведена точка входа в Windows программу. Вывод сцены помещен в цикл обработки сообщений, чтобы добиться максимального числа кадров в секунду (fps - frame per second).
WINAPI WinMain // точка входа в Windows программу (HINSTANCE hlnstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
winclass(); // регистрация оконного класса HWND hWnd=makewin("Example"); // создание окна gl.init(hWnd); // инициализация OpenGL
example_init(); // инициализация переменных ShowWindow(hWnd,SW_SHOW); // отображаем окно
MSG msg; // идентификатор обрабатываемого сообщения while(msg.message !=WM_QUIT)
{
// получаем сообщение из очереди PeekMessage(&msg,NULL,0,0,PM_REMOVE);
// передаём сообщение окну адресату DispatchMessage(&msg);
TranslateMessage(&msg);
draw(); // вывод сцены в буфер кадра OpenGL // вывод в окно SwapBuf fers(gl.hdc);
}
return 0;
}
Вершина Каждая создаваемая в OpenGI модель описывается набором вершин, имеющих ряд свойств. Более подробно о некоторых из них смотрите в соответствующих пунктах, а здесь приведено лишь их краткое описание.