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);
…
|