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 ' ...
随机推荐
- 加载jar文件输出class和method
package file import java.util.jar.JarEntry import java.util.jar.JarFile import org.junit.Test; class ...
- ASP.NET错误页
当页面发生错误的时候,ASP.Net会将错误信息展示出来,这样一来不好看,二来会泄露网站的内部实现信息,给网站带来安全隐患,因此需要定制错误页,发生错误时显示开发人员定制的页面404页面放点广告也是好 ...
- js清空前后空格
function trim(sValue){ var lastValue=this.replace(/(^\s*)|(\s*$)/g,""); ...
- 浅谈页面无刷新技术ajax
现在一般网站都是用ajax来实现页面无刷新操作的. 什么是无刷新:ajax可以实现页面与后台的数据交互,用户完全感觉不出页面有任何的刷新,这就是AJAX的无刷新. ajax方法实现: 可以对ajax进 ...
- "position:relative"在IE中的Bug
当子元素过高导致父元素出现滚动条时,它并不会像预期的那样呆在父元素里,而是浮在父元素之上,并且位置不随滚动条的移动而改变.根源就是子元素的"position:relative".目 ...
- yii2源码学习笔记(十八)
View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...
- STM32库函数实现方法
一.概述 1.调用STM32库函数配置与直接配置寄存器 ① 直接配置寄存器 使用过51单片机的朋友都知道为了将IO口配置成某种特殊功能或者配置中断控制,我们先将需要如下步骤: 根据需要配置功能计算值- ...
- AOP和IOC理解
在百度上看到一篇很有意思的文章,是对AOP的一种解释,如下:(摘自:百度文库的 AOP和IOC最容易理解的说明(Spring知识小计)): IOC,依赖倒置的意思, 所谓依赖,从程序的角度看,就是比如 ...
- Clang 与 LLVM
我们在iOS调试中经常会看到Clang这个,那么Clang到底是什么呢?我们来简单了解一下. Clang是一个C.C++.OC语言的轻量级编译器.源代码发布于BSD协议下.Clang是由C++编写,基 ...
- asp.net与MVC4的路由原理和过程【学习笔记】
当IIS收到一个http请求,把请求信息发给对应的HttpModel(实际是实现类UrlRoutingModule),在HttpModel中会注册HttpApplication 类中的PostReso ...