Windows下,通过程序设置全屏抗锯齿(多重采样)的方法
这里说的全屏抗锯齿,不是基于着色器的FXAA之类的方式,而是兼容性更好的,基于固定管线的多重采样方式。
先来说一下开发环境,我用的是VC2013+GLEW1.11。
要通过程序设置多重采样,首先需要进入控制面板,确定抗锯齿的设置是“根据应用程序而定” ,当然,这个设置的具体名称,不同的显卡厂商有不同的叫法。
接下来,就是重点了。
Windows下要通过程序设置多重采样,必须使用wglChoosePixelFormatARB这个函数。目前网上基本都是自己去获取这个函数的接口地址,其实根本不用这么麻烦。GLEW已经有这个函数接口了,我们要做的,就是正确地使用而已。正确使用这个函数的关键,就是需要创建一个临时窗体,通过这个窗体,我们可以初始化GLEW,以及获取必须的基础像素格式,然后再使用wglChoosePixelFormatARB这个函数,得到可用的多重采样像素格式,最后,对渲染窗口设置这个像素格式即可。
//----------创建一个临时窗体
HWND secondwnd;
WNDCLASS wc; //窗体类结构体
wc.style = CS_HREDRAW | CS_VREDRAW; //窗体风格
wc.lpfnWndProc = WndProc; //窗体处理函数
wc.cbClsExtra = ; //窗体类是否由扩展
wc.cbWndExtra = ; //窗体实例是否由扩展
wc.hInstance = NULL; //窗体句柄
wc.hIcon = LoadIcon(, IDI_APPLICATION); //窗体图标
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //窗体鼠标样式
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗体背景颜色
wc.lpszMenuName = NULL; //窗体菜单
wc.lpszClassName = L"BaseWndClass"; //窗体类名
if (!RegisterClass(&wc)) //判断窗体是否注册成功
{
MessageBox(L"注册失败");
return;
}
//创建窗体
secondwnd = CreateWindow(L"BaseWndClass", //窗体类名
L"MyFrom", //窗体标题名
WS_OVERLAPPEDWINDOW, //窗体风格
CW_USEDEFAULT,
CW_USEDEFAULT, //窗体坐标
CW_USEDEFAULT,
CW_USEDEFAULT, //窗体坐标
NULL, //窗体的父窗体
NULL, //窗体的子菜单
NULL, //窗体句柄
NULL); // 如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL
if (secondwnd == )//判断创建窗体是否成功
{
MessageBox(L"创建窗体失败");
return;
}
::ShowWindow(secondwnd, SW_HIDE); //显示窗体
::UpdateWindow(secondwnd); //绘制窗体; PIXELFORMATDESCRIPTOR pfd = //定义像素格式
{
sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小
, // 版本号
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, // 申请 RGBA 格式
,
, , , , , , // 忽略的色彩位
, // 无Alpha缓存
, // 忽略Shift Bit
, // 无累加缓存
, , , , // 忽略聚集位
, // 32位 Z-缓存 (深度缓存)
, // 无蒙板缓存
, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
, // Reserved
, , // 忽略层遮罩
};
//----------用这个临时窗体得到一个可用HGLRC
HDC secondDC = ::GetDC(secondwnd);
int nIndex = ChoosePixelFormat(secondDC, &pfd); //选择刚刚定义的像素格式
if (nIndex == )
{
return;
} SetPixelFormat(secondDC, nIndex, &pfd); //设置像素格式 glRC = wglCreateContext(secondDC);
wglMakeCurrent(secondDC, glRC);
//----------然后初始化GLEW
GLenum glerr = glewInit();
if (glerr != GLEW_OK)
{
MessageBox(L"无法初始化GLEW!");
}
else
{
OutputDebugString(L"成功加载GLEW\n");
} UINT Multisample = ; //4倍多重采样率
int pixelformat;
UINT numformat;
float fAttributes[] = { , };
int iAtributes[] =
{
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
WGL_COLOR_BITS_ARB, ,
WGL_ALPHA_BITS_ARB, ,
WGL_DEPTH_BITS_ARB, ,
WGL_STENCIL_BITS_ARB, ,
WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
WGL_SAMPLE_BUFFERS_ARB, GL_TRUE,
WGL_SAMPLES_ARB, Multisample,
,
};
//----------取得可用的多重采样像素格式
if (!wglChoosePixelFormatARB(secondDC, iAtributes, fAttributes, , &pixelformat, &numformat))
{
MessageBox(L"找不到可用的抗锯齿格式");
} //----------删除由临时窗体得到的HGLRC,同时销毁临时窗体
wglMakeCurrent(NULL, NULL);
wglDeleteContext(glRC); ::ReleaseDC(secondwnd, secondDC);
::DestroyWindow(secondwnd);
//----------用得到的多重采样像素格式,设置渲染窗体
SetPixelFormat(this->GetDC()->m_hDC, pixelformat, &pfd); //设置像素格式 glRC = wglCreateContext(this->GetDC()->m_hDC);
wglMakeCurrent(this->GetDC()->m_hDC, glRC);
上面这段代码,就是按照我所说的方式初始化了OpenGL。
这样设置后,你就能通过glEnable/glDisable启用或禁用多重采样了。
希望这点经验能够对和我一样曾困于此问题的朋友有所帮助。
Windows下,通过程序设置全屏抗锯齿(多重采样)的方法的更多相关文章
- windows下的定时任务设置详解
windows下的定时任务设置详解 一.总结 一句话总结: 1.php.exe是什么? 就是php中自带的一个exe,不是我们写的,这个exe是可以执行其他的PHP的 二.windows下的定时任务设 ...
- Windows下的程序及热键监视神器——Spy++
Windows下的程序及热键监视神器--Spy++ 背景 在使用Windows的时候,偶尔会发现某些应用程序的热键不生效了:又或是桌面弹出了弹框却并不知道这个弹框来自何处.例如,本人最近使用Vim的时 ...
- Windows下安装并设置Redis
Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定.详情请参考: http://redis.io/download 但有时候又想在windows下 ...
- Windows下Python IDLE设置
Windows下安装Python 2.7.5,发现IDLE是个不错的IDE,可以编辑.运行, 希望与.py文件关联起来,作为编辑器使用,经过尝试,找到了一个方法. 打开注册表,找到\KEY_CLA ...
- windows下控制台程序实现窗口显示
windows下实现窗口显示,如果限定是C/C++语言,并且是原生Windows支持,需要使用GDI或GDI+.一般是在Visual Studio里新建Win32应用程序,而不是Win32 conso ...
- Windows下Fortran编译Lapack库及使用的方法(转自新浪)
Lapack 是一套被非常广泛使用的线性代数计算工具库,现在的主要编写语言时 Fortran90 .Lapack 基本上可以说是速度最快的线性代数计算库,我们看看官方给出的其被应用的几个地方就可以看出 ...
- windows下sqlplus / as sysdba报ora-12560的解决方法
环境:win7_64位.数据库版本ORACLE11G_R2 在CMD窗口,使用下面三个命令可正常连接数据库:C:\Users\Administrator> sqplus /nolog C:\Us ...
- windows下安装easy_install, pip 及whl文件安装方法
转:http://www.cnblogs.com/wu-wenmin/p/4250330.html 写在前面的话 最近在看"Computer Vision with Python" ...
- 关于 windows 下 node_modules\node-sass\vendor 的报错解决方法
项目git clone下来之后,运行npminstall, npm start报错代码如下: ERROR in ENOENT: no such file or directory, scandir ' ...
随机推荐
- Codevs 1427 特种部队(双路DP)
1427 特种部队 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 某特种部队接到一个任务,需要潜入一个仓库.该部队士兵分为两路,第一 ...
- websocket++简单使用例子
前言 html5支持使用websocket协议与服务器保持一个长连接,方便双方互相传输数据,而且服务器也能主动发送信息给客户端,而在这之前使用HTTP是很难做到的.下面介绍使用C++实现的websoc ...
- IniParse解析类
说明 iniParse这个类是一个解析ini文件的类,他的功能和Windows下GetPrivateProfileString的功能一样,可以很方便的保存读取配置. 当然他不是只有GetPrivate ...
- js 判断数组中是否存在
/* 判断数组中是否存在 var somearray = ["mon", "tue", "wed", "thur"] s ...
- 泛型集合List<T> Dictionary<K,V>
List<T>类似于ArrayList,ArrayList的升级版. 各种方法:Sort().Max().Min().Sum()… Dictionary<K,V>类似于Ha ...
- Cassandra1.2文档学习(1)——Cassandra基本说明
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- nginx 反向代理 odoo, 速度提升
1: sudo apt-get install nginx 2: add server: 在/etc/nginx/sites-enabled 中增加一个可用的server. 文件如下图所示 3:重 ...
- Polygon Table - Google Chrome
Polygon table by Pedro Amaro Santos Lisboa, Portugal posted at http://forums.cgsociety.org/showthrea ...
- HDU1004 (数组元素出现最多)
HDU1004 思路:求数组中出现次数最多的那个元素: 遍历数组元素,找出每个元素出现的次数 Input Input contains multiple test cases. Each test c ...
- sqlserver access 多数据库操作
今天搞了一天的事情, 更新 ACCESS 數據庫 ,要從 SQL SERVER 2008數據庫中 查詢資料.沒找到資料 只能自己做了. 首先查找一下 ,如何 用SQL 語句 select * ...