这里说的全屏抗锯齿,不是基于着色器的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下,通过程序设置全屏抗锯齿(多重采样)的方法的更多相关文章

  1. windows下的定时任务设置详解

    windows下的定时任务设置详解 一.总结 一句话总结: 1.php.exe是什么? 就是php中自带的一个exe,不是我们写的,这个exe是可以执行其他的PHP的 二.windows下的定时任务设 ...

  2. Windows下的程序及热键监视神器——Spy++

    Windows下的程序及热键监视神器--Spy++ 背景 在使用Windows的时候,偶尔会发现某些应用程序的热键不生效了:又或是桌面弹出了弹框却并不知道这个弹框来自何处.例如,本人最近使用Vim的时 ...

  3. Windows下安装并设置Redis

    Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定.详情请参考: http://redis.io/download 但有时候又想在windows下 ...

  4. Windows下Python IDLE设置

    Windows下安装Python 2.7.5,发现IDLE是个不错的IDE,可以编辑.运行, 希望与.py文件关联起来,作为编辑器使用,经过尝试,找到了一个方法.   打开注册表,找到\KEY_CLA ...

  5. windows下控制台程序实现窗口显示

    windows下实现窗口显示,如果限定是C/C++语言,并且是原生Windows支持,需要使用GDI或GDI+.一般是在Visual Studio里新建Win32应用程序,而不是Win32 conso ...

  6. Windows下Fortran编译Lapack库及使用的方法(转自新浪)

    Lapack 是一套被非常广泛使用的线性代数计算工具库,现在的主要编写语言时 Fortran90 .Lapack 基本上可以说是速度最快的线性代数计算库,我们看看官方给出的其被应用的几个地方就可以看出 ...

  7. windows下sqlplus / as sysdba报ora-12560的解决方法

    环境:win7_64位.数据库版本ORACLE11G_R2 在CMD窗口,使用下面三个命令可正常连接数据库:C:\Users\Administrator> sqplus /nolog C:\Us ...

  8. windows下安装easy_install, pip 及whl文件安装方法

    转:http://www.cnblogs.com/wu-wenmin/p/4250330.html 写在前面的话 最近在看"Computer Vision with Python" ...

  9. 关于 windows 下 node_modules\node-sass\vendor 的报错解决方法

    项目git clone下来之后,运行npminstall, npm start报错代码如下: ERROR in ENOENT: no such file or directory, scandir ' ...

随机推荐

  1. ffmpeg只使用h264编译参数

    --disable-everything --enable-decoder=h264 --enable-demuxer=h264 --enable-parser=h264 --disable-ffpl ...

  2. /var子目录

    /var子目录 目录 描述 /var/log/message 日志信息,按周自动轮询 /var/spool/cron/root 定时器配置文件目录,默认按用户命名 /var/log/secure 记录 ...

  3. PHP curl 采集内容之规则 及图片下载方法2

    <?phpheader("Content-type:text/html; charset=utf-8");/*$pattern = '/xxx(.*)yyyy/isU'; / ...

  4. 移动端开发(使用webuploader上传图片,客户端交互,修改alert弹窗等)

    之前实习做的一个移动端的页面 需要的功能有图片上传 点击客户端的返回按钮 有提示(即与客户端有交互) 遇到不少的坑 总结一下问题 1.图片上传功能  使用工具 百度的webuploader 暂时遇到的 ...

  5. Python深入学习笔记(一)

    写在前面的话 从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理.科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力.虽然看了一些Python的教程 ...

  6. CocoaPods简单使用

    CocoaPods的原理 CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中.Pods项目最终会编 ...

  7. python和django的一些小技巧(locals()...)

    locals() 技巧: 思考一下我们对 current_datetime 的最后一次赋值: >>> import datetime >>> def current ...

  8. poj 1132

    暑假集训做的第一个题,模拟,挺简单的,不过要细心点... 没什么好说的,直接贴代码: #include<cstdio> #include<cstring> using name ...

  9. hdu 1824

    也是一道2-sat的入门题: 不过题目描述的不清楚,看了别人的题解才知道题意: 和上面的那题差不多,一个模板: 代码: #include<cstdio> #include<stack ...

  10. java.lang.UnsupportedClassVersionError(java项目版本一致问题)

    报此错误,一般都是由于在myeclipse中的java项目是用高版本(jdk1.6之后)的jdk进行编译后生成的class文件,却要运行在低版本的jdk虚拟机上,导致这个错误 解决办法: 在myecl ...