关于OpenGL游戏全屏模式的设置
使用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
#include
#include
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[32];
// 存储显示器在系统桌面中的坐标范围
RECT rect;// 存储所有该显示器支持的显示模式的基本数据
std::vector<UsableMode> modes;
};
BOOL CALLBACK MonitorEnumProc( HMONITOR hMonitor, HDC hDC, LPRECT lpRect, LPARAM lParam )
{
std::vector* 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 = 0;// 枚举该显示器所有支持的显示模式
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 monitors;
// 枚举所有显示器
EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(&monitors) );const UsableMonitor& use_monitor = monitors[0]; // 这里随便选一个显示器
const UsableMode& use_mode = use_monitor.modes[2]; // 这里随便选一个模式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 0;
}
文章来源:网页游戏 http://www.hp91.cn/ 网页游戏
关于OpenGL游戏全屏模式的设置相关推荐
- 《OpenGL游戏程序设计》学习笔记---第七章图像、位图与OpenGL
<OpenGL游戏程序设计> K.霍金/D.阿斯特 著 田昱川 译 1. OpenGL位图 OpenGL位图被定义为像素的矩阵阵列,每个像素对应矩阵中一个位的数据 ...
- 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第一部分)
将游戏和其他使用大量 3D 图形的应用从 OpenGL 标准移植到 Google Android 设备(包括构建在英特尔® 凌动™ 微架构上的设备)存在巨大的机遇,因为基于 OpenGL 的游戏.游戏 ...
- 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第二部分)
本文是两部分中的第二部分,讨论了将 OpenGL 游戏移植到 Google Android 平台存在的障碍. 在开始游戏植入项目(包括 OpenGL 扩展的差别.浮点支持.纹理压缩格式和 GLU 库) ...
- 如果将OpenGL的MVP矩阵设置为单位阵
如果将OpenGL的MVP矩阵设置为单位阵,会发生什么? opengl的几个坐标空间: object space-> eye space-> clip space -> NDC -& ...
- 微信和平精英服务器怎么填,和平精英微信游戏名片怎么设置?微信游戏名片设置方法一览[多图]...
和平精英微信游戏名片怎么设置?和平精英为玩家推出的这个微信游戏名片相信吸引了不少玩家的关注,很多人都不知道怎么设置,今天为大家分享和平精英微信微信游戏名片设置方法一览,感兴趣的小伙伴一起来看看吧. 和 ...
- 游戏虚拟盘两台服务器,网维大师游戏虚拟盘如何设置
之前的一篇文章中我们向大家介绍了关于网维大师流量控制如何使用的问题,大家都看过了吧,现在我们要大家说说的就是网维大师游戏虚拟盘如何设置,大家就跟着我们5636网吧联盟的游戏更新栏目一起去看看吧! 点击 ...
- [游戏教程]快捷键设置
快捷键设置 ①记事本方式打开 ...\游戏目录\Left 4 Dead\left4dead\cfg\config.cfg ②在控制台输入设置命令 设置命令 格式为(英文数字): bind " ...
- 方舟服务器 参数修改,《方舟:生存进化》单机模式游戏参数ini设置指南
<方舟:生存进化>单机模式游戏参数ini设置指南 2015-06-30 13:47:41来源:3DM论坛编辑:评论(0) <方舟:生存进化>中有部分玩家喜欢单机模式,今天给大家 ...
- OpenGL的glViewPort窗口设置函数实现分屏
OpenGL的glViewPort窗口设置函数实现分屏 之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPo ...
- opengl游戏引擎源码_UE4渲染引擎模块简介(1)
UE4官方文档中<Graphics Programming Overview>开篇即说:UE4的渲染代码太多故难以从宏观上快速预览它的全貌(There is a lot of render ...
最新文章
- Recyclerview 添加一个数组
- Hibernate学习笔记(二)
- speedbutton用法
- csredis封装_ASP.NET Core 2.0下使用Redis——基于CSRedis实现
- dnn神经网络_【李宏毅机器学习笔记】深度神经网络(DNN)
- PHP 霸主地位被动摇,JIT 是穷途末路后的绝地反击?
- java+c#+json+时间_Java与C#间json日期格式互转完美解决方案
- 500报错及故障排除
- 二手房数据分析预测系统
- CSS为字体添加过度色
- 电脑搜索文件的服务器,Archivarius注册版
- Linux I2C驱动
- Comet OJ - 2019国庆欢乐赛(赛后整理)
- 【寒武纪】视觉算法MLU220硬件适配(1)
- python群控手机过检测_手游群控检测规避封号攻略,工作室内部亲授
- <<计算机操作系统(慕课版)>>第三章参考答案
- 电子助力方向机控制模块_易力达电子助力控制器模块ECU威旺五菱长安电动助力方向机电脑板...
- python练手经典100例项目-Python入门练手100例
- 题解 P5022 【旅行】
- MySQL部署及编译安装