Chapter 4
Полезные и бесполезные мелочи

4.14  Как запустить OpenGL на весь экран?

    

В OpenGL нет полноэкранного режима, только оконный. Это, однако, не проблема - ничто не мешает сделать окно размером во весь экран (скажем, 1024x768); истинные размеры экрана можно получить с помощью функции GetSystemMetrics(SM_CYSCREEN).

Как это скажется на производительности - целиком зависит от драйвера видеокарты. В идеале, он должен понимать такую ситуацию как особую. Кстати, драйвера для чипов 3Dlabs так и делают - если окно программы полностью перекрывает экран, используется аппаратная двойная буферизация. Если же окно программы занимает только часть экрана, драйвер просто копирует данные из одной области видеопамяти в другую.

И еще одно замечание. Чтобы курсор мыши не портил вид, его можно спрятать с помощью функции SetCursor(NULL), а показать обратно - используя ту же функцию, но с правильным хэндлом курсора (HCURSOR) в качестве параметра.

Можно использовать библиотеку GLUT. В этой библиотеке имеется функция glutFullScreen(); В этой библиотеке имеется также так называемый Game-Mode. Это значит, что можно задавать не только полноэкранный режим но и определять его параметры, например:
...
 glutInit(&argc, argv);
 // Задаётся ширина и высота окна OpenGL
 glutInitWindowSize(windowwidth, windowheight);
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
 //Размер экрана:число бит на пиксель@частота обновления экрана
 glutGameModeString("640x480:16@72"); 
                                     
 glutEnterGameMode(); // Войти в Game-Mode
...
Более детально о GLUT смотрите в разделе 7.7. Второй способ, действует только в Windows.
...
// Set Display mode 800x600 32bpp

 DEVMODE md = {0};
 md.dmSize       = sizeof(md);
 md.dmFields     = DM_PELSWIDTH | DM_PELSHEIGHT;
 md.dmPelsWidth  = 800; // Ширина экрана
 md.dmPelsHeight = 600; // Высота экрана
 md.dmFields |= DM_BITSPERPEL;
 md.dmBitsPerPel = 32; // Количество бит на пиксель
 int change;
 change = ChangeDisplaySettings(&md, CDS_FULLSCREEN); 
...