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 модель описывается набором вершин, имеющих ряд свойств. Более подробно о некоторых из них смотрите в соответствующих пунктах, а здесь приведено лишь их краткое описание.


⇐ вернуться назад | | далее ⇒