使用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. XAF-DevExpress.ExpressApp.DC.Xpo.XpoTypeInfoSource 生成实体的过程-学习笔记

    //目的,想自己生成实体类,不走dc的生成机制,所以研究一下此方法.public void GenerateEntities(string generatedAssemblyFile) { lock ...

  2. TCP Over HTTP 的Buffer问题

    记录下备忘. 场景:要把TCP拆成一个个HTTP请求,通过Proxy 1.HTTP Client上载数据到CCProxy ,然后再到Web服务器的时候. 如果数据量比较小,例如10个字节,Proxy就 ...

  3. Java+Netty实现的RESTful框架--netty-rest-server

    在工作中用Netty做了几个服务,感觉Netty做出来的程序性能好,资源占用少,但是实现Http服务比较麻烦,于是就参考Spring MVC的注解基于Netty实现了一个轻量级的RESTful框架. ...

  4. Python的requests、greenlet和gevent模块在windows下安装

    一.requests模块在windows下安装 Linux系统下requests的安装方法在http://docs.python-requests.org/en/latest/user/install ...

  5. POJ2251-Dungeon Master(3维BFS)

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  6. mysql读写分离配置(整理)

    mysql读写分离配置 环境:centos7.2 mysql5.7 场景描述: 数据库Master主服务器:192.168.206.100 数据库Slave从服务器:192.168.206.200 M ...

  7. SICP读书笔记 2.5

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  8. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  9. python实现简单线性回归

    之前推导了一元线性回归和多元线性回归,今天就用python来实现一下一元线性回归 先看下之前推导的结果   ,  第一种是用循环迭代的计算方法.这里的x,y是numpy中的array类型 def su ...

  10. 前端_JavaScript

    目录 JavaScript的基础 引入方式 JS的变量.常量和标识符 JS的数据类型 运算符 流程控制 JavaScript的对象 String对象 Array对象 Date对象 Math对象 Fun ...