使用DirectX的API的话可以给游戏窗口设置指定的显示器和全屏独占模式,但是如果使用OpenGL的API就比较遗憾不能直接设置。

以下内容基于Windows系统。

如果使用OpenGL渲染,第一步当然是创建窗口,如果想要设置全屏模式,需要做以下几步操作:

一、把窗口设为无边框

二、把窗口坐标设置到屏幕左上角,窗口大小设为跟屏幕同样大小

三、如果有必要调整屏幕刷新率,要需要调用 ChangeDisplaySettingsEx 函数

四、窗口必须有焦点并且是激活的。

关于OpenGL全屏独占模式,经过我在某404网站的努力搜索,得到如下的结论:

一、如果OpenGL窗口要使用全屏独占模式,首先得按上面的几步来做。

二、不断调用 wglSwapBuffers 之后,显卡驱动可能就会认为你的全屏OpenGL窗口需要加速渲染,然后把你的窗口设置为全屏独占模式。

三、能不能用全屏独占还得看显卡驱动的心情。

以下是多显示器测试的一点代码:

// ConsoleApplication1.cpp : This file contains the 'main' function. Program execution begins and ends there.
// #include "pch.h"
#include <iostream>
#include <vector>
#include <algorithm> struct UsableMode
{
// 分辨率宽度(像素)
DWORD dmPelsWidth;
// 分辨率高度(像素)
DWORD dmPelsHeight;
// 颜色深度(位)
DWORD dmBitsPerPel;
// 刷新率(Hz)
DWORD dmDisplayFrequency;
}; // 这个操作符用于std::sort排序
bool operator<( const UsableMode& lhs, const UsableMode& rhs )
{
if ( lhs.dmPelsWidth > rhs.dmPelsWidth )
{
return true;
}
else if ( lhs.dmPelsWidth == rhs.dmPelsWidth )
{
if ( lhs.dmPelsHeight > rhs.dmPelsHeight )
{
return true;
}
else if ( lhs.dmPelsHeight == rhs.dmPelsHeight )
{
if ( lhs.dmDisplayFrequency > rhs.dmDisplayFrequency )
{
return true;
}
}
} return false;
} struct UsableMonitor
{
// 存储显示器的设备名,通过这个设备名可以改变任意一台显示器的显示模式
// 此处的设备名是系统逻辑上的标识,这个设备名可以用来指定所有连接到电脑的显示器,不管显示器插在哪张显卡上
wchar_t device_name[]; // 存储显示器在系统桌面中的坐标范围
RECT rect; // 存储所有该显示器支持的显示模式的基本数据
std::vector<UsableMode> modes;
}; BOOL CALLBACK MonitorEnumProc( HMONITOR hMonitor, HDC hDC, LPRECT lpRect, LPARAM lParam )
{
std::vector<UsableMonitor>* monitors = reinterpret_cast<decltype(monitors)>(lParam); monitors->push_back( UsableMonitor() );
auto& new_monitor = monitors->back(); MONITORINFOEX monitor_info;
monitor_info.cbSize = sizeof( monitor_info ); GetMonitorInfo( hMonitor, &monitor_info ); // 存储设备名
wcscpy_s( new_monitor.device_name, monitor_info.szDevice );
// 存储坐标范围
new_monitor.rect = monitor_info.rcMonitor; DEVMODE display_setting;
int mode_num; display_setting.dmSize = sizeof( display_setting );
mode_num = ; // 枚举该显示器所有支持的显示模式
while ( EnumDisplaySettings( monitor_info.szDevice, mode_num++, &display_setting ) )
{
UsableMode new_mode; // 只保存关心的数据就够了
new_mode.dmPelsWidth = display_setting.dmPelsWidth;
new_mode.dmPelsHeight = display_setting.dmPelsHeight;
new_mode.dmBitsPerPel = display_setting.dmBitsPerPel;
new_mode.dmDisplayFrequency = display_setting.dmDisplayFrequency; new_monitor.modes.push_back( new_mode );
} // 排序一下,分辨率高的模式排前面
std::sort( new_monitor.modes.begin(), new_monitor.modes.end() ); wprintf( L"Device: [%s]\n", new_monitor.device_name ); for ( auto& mode : new_monitor.modes )
{
wprintf( L"Mode: Width=%d Height=%d Bits=%d Frequency=%d\n", mode.dmPelsWidth, mode.dmPelsHeight, mode.dmBitsPerPel, mode.dmDisplayFrequency );
} return TRUE;
} int main()
{
// 存储所有可用的显示器
std::vector<UsableMonitor> monitors; // 枚举所有显示器
EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(&monitors) ); const UsableMonitor& use_monitor = monitors[]; // 这里随便选一个显示器
const UsableMode& use_mode = use_monitor.modes[]; // 这里随便选一个模式 DEVMODE test_mode;
ZeroMemory( &test_mode, sizeof( test_mode ) );
test_mode.dmSize = sizeof( test_mode );
test_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
test_mode.dmPelsWidth = use_mode.dmPelsWidth;
test_mode.dmPelsHeight = use_mode.dmPelsHeight;
test_mode.dmBitsPerPel = use_mode.dmBitsPerPel;
test_mode.dmDisplayFrequency = use_mode.dmDisplayFrequency; // 改变该显示器的显示模式
// 使用 CDS_FULLSCREEN 这个标识之后系统会在进程退出后还原该显示器的显示模式
ChangeDisplaySettingsEx( use_monitor.device_name, &test_mode, NULL, CDS_FULLSCREEN, NULL ); system( "PAUSE" ); return ;
}

关于OpenGL游戏全屏模式的设置的更多相关文章

  1. Unity 开发游戏Game分辨率设置

    最近自己开发小游戏,突然又被Game视图中设置分辨率被诱惑了, 我到底该怎么设置分辨率设置的图片才能让电脑和手机尺寸显示的大小一模一样呢? 然后又被手机尺寸和分辨率迷惑了! =.= 越搞越混   分辨 ...

  2. 【OpenGL游戏开发之二】OpenGL常用API

    OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...

  3. 【OpenGL游戏开发之三】OpenGl核心函数库汇总

    OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形 glAlphaFunc允许设置alpha检测功能 glA ...

  4. OpenGL的glViewPort窗口设置函数实现分屏

    之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码: //从这里开始进 ...

  5. 《OpenGL游戏编程》第9章-PlanarShadow关键代码注释

    阴影这块确实是难点.说到阴影就必须提到投影矩阵.模板值为1和2时分别渲染.说来话长,仅仅放上代码,供日后查阅. /** 渲染墙面和阴影 */ void CPlanarShadow::Render() ...

  6. VUE,使用物理引擎Box2D设计类愤怒小鸟的击球游戏--基本架构设置

  7. Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理

    在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...

  8. OpenGL(三) RGBA颜色设置

    OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGBA颜色模式,保存的数据直接代表了颜色, ...

  9. OpenGL(七) 光照模型及设置

    OpenGL把现实世界中的光照系统近似归为三部分,分别是光源.材质和光照环境. 光源就是光的来源,是"光"这种物质的提供者: 材质是指被光源照射的物体的表面的反射.漫反射(Open ...

随机推荐

  1. 使用 Django WebSocket Redis 搭建在线即时通讯工具

    话不多说先上效果图演示 项目:http://112.74.164.107:9990/ 1.安装组建 redis: yum install redis/apt install redis 2.创建虚拟化 ...

  2. Microsoft Visual Studio International Pack

    Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持.使用该类库提供的类,.NET 开发人员可以更方便的创建支 ...

  3. python中面向对象_类_对象的概念与定义

    1. 面向对象的概念,面向对象是一种编程思想. 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型 2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤. 面向 ...

  4. nginx遇到的配置问题

    配置的例子如下: server { listen ; server_name localhost; #kzjtrans-web location /kzjtrans-web/ { proxy_pass ...

  5. 【原创】标准HTTP请求工具类

    以下是个人在项目开发过程中,总结的Http请求工具类,主要包括四种: 1.处理http POST请求[XML格式.无解压]: 2.处理http GET请求[XML格式.无解压]: 3.处理http P ...

  6. 【LeetCode算法题库】Day4:Regular Expression Matching & Container With Most Water & Integer to Roman

    [Q10] Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  7. 2.4 Oracle之DCL的SQL语句之用户权限以及三大范式

    DCL   (Data Control Language,数据库控制语言)用于定义数据库权限 一.用户权限 1.1  建立用户以及授权: Eg :CREATE USER 用户名  IDENTIFIED ...

  8. 小球下落(Dropping Balls, Uva 679)

    题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...

  9. Centos7 Jenkins

    代码上线 持续集成 随时随地将代码合并,这种方法叫做持续集成. 持续集成(CONTINUOUS INTEGRATION,简称CI)持续集成指的是,频繁地(一天多次)将代码集成到主干.它的好处主要有两个 ...

  10. Notes of Daily Scrum Meeting(11.4)

    Notes of Daily Scrum Meeting 2014年11月4日  星期二  20:30—21:00 团队成员 今日团队任务 当日工作分配额 完成情况 陈少杰 阅读理解代码中底层与数据库 ...