关于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 <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游戏全屏模式的设置的更多相关文章
- Unity 开发游戏Game分辨率设置
最近自己开发小游戏,突然又被Game视图中设置分辨率被诱惑了, 我到底该怎么设置分辨率设置的图片才能让电脑和手机尺寸显示的大小一模一样呢? 然后又被手机尺寸和分辨率迷惑了! =.= 越搞越混 分辨 ...
- 【OpenGL游戏开发之二】OpenGL常用API
OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...
- 【OpenGL游戏开发之三】OpenGl核心函数库汇总
OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形 glAlphaFunc允许设置alpha检测功能 glA ...
- OpenGL的glViewPort窗口设置函数实现分屏
之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码: //从这里开始进 ...
- 《OpenGL游戏编程》第9章-PlanarShadow关键代码注释
阴影这块确实是难点.说到阴影就必须提到投影矩阵.模板值为1和2时分别渲染.说来话长,仅仅放上代码,供日后查阅. /** 渲染墙面和阴影 */ void CPlanarShadow::Render() ...
- VUE,使用物理引擎Box2D设计类愤怒小鸟的击球游戏--基本架构设置
- Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理
在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...
- OpenGL(三) RGBA颜色设置
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGBA颜色模式,保存的数据直接代表了颜色, ...
- OpenGL(七) 光照模型及设置
OpenGL把现实世界中的光照系统近似归为三部分,分别是光源.材质和光照环境. 光源就是光的来源,是"光"这种物质的提供者: 材质是指被光源照射的物体的表面的反射.漫反射(Open ...
随机推荐
- arpspoof+driftnet+ ARP欺骗简单图片抓取
arpspoof+driftnet+ ARP欺骗简单图片抓取 driftnet是一款简单而使用的图片捕获工具,可以很方便的在网络数据包中抓取图片.该工具可以实时和离线捕获指定数据包中是图片 环境 受害 ...
- Jmeter 数据库配置池设置IP为参数
我在网上查了很多资料,发现jmter链接数据库的URL都是设置成固定值的.没有参数化. 当我需要使用配置文件链接不同服务器上的数据库的时候,发现无法实现. 原因在于:jmeter的元件执行优先级是配置 ...
- TPO-20-Apply for the undergraduate research fund
/* 加粗:语音部分 * 红色:单词部分 * 斜体:语法部分 * 下划线:信号词/句 */ 第 1 段 1.Listen to a conversation between a ...
- Overlay 网络
- 微软职位内部推荐-SW Engineer II for Enterprise Platform
微软近期Open的职位: Job posting title: SDE II Location: China, Beijing Group Overview Discovery & Colla ...
- flex布局时,内容区域自适应高度
页面元素高度固定,中间的元素需要撑满屏幕,或者内容多时显示滚动条时,我们要把父元素设置为height:100vh <div class="parent"> <di ...
- 20162314 《Program Design & Data Structures》Learning Summary Of The Second Week
20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Second Week ...
- Scapy 网段中ping扫描
安装scapy pip3 install scapy-python3 交互式ip包构造 #scapy >>> ping = sr(IP(dst='202.100.1.1')/ICMP ...
- Beta Scrum Day 7 — 听说
7#听说
- iOS- 什么是GitHub?关于它的自我介绍「初识 GitHub」
1 前言 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 GitHub 的才对,我当初接触 GitHub 也大概工作了一年多才开始学习使用,我读者里很多是初学者,而且还有很多是在校大 ...