这里说的全屏抗锯齿,不是基于着色器的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. 加载jar文件输出class和method

    package file import java.util.jar.JarEntry import java.util.jar.JarFile import org.junit.Test; class ...

  2. ASP.NET错误页

    当页面发生错误的时候,ASP.Net会将错误信息展示出来,这样一来不好看,二来会泄露网站的内部实现信息,给网站带来安全隐患,因此需要定制错误页,发生错误时显示开发人员定制的页面404页面放点广告也是好 ...

  3. js清空前后空格

    function trim(sValue){                var lastValue=this.replace(/(^\s*)|(\s*$)/g,"");     ...

  4. 浅谈页面无刷新技术ajax

    现在一般网站都是用ajax来实现页面无刷新操作的. 什么是无刷新:ajax可以实现页面与后台的数据交互,用户完全感觉不出页面有任何的刷新,这就是AJAX的无刷新. ajax方法实现: 可以对ajax进 ...

  5. "position:relative"在IE中的Bug

    当子元素过高导致父元素出现滚动条时,它并不会像预期的那样呆在父元素里,而是浮在父元素之上,并且位置不随滚动条的移动而改变.根源就是子元素的"position:relative".目 ...

  6. yii2源码学习笔记(十八)

    View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...

  7. STM32库函数实现方法

    一.概述 1.调用STM32库函数配置与直接配置寄存器 ① 直接配置寄存器 使用过51单片机的朋友都知道为了将IO口配置成某种特殊功能或者配置中断控制,我们先将需要如下步骤: 根据需要配置功能计算值- ...

  8. AOP和IOC理解

    在百度上看到一篇很有意思的文章,是对AOP的一种解释,如下:(摘自:百度文库的 AOP和IOC最容易理解的说明(Spring知识小计)): IOC,依赖倒置的意思, 所谓依赖,从程序的角度看,就是比如 ...

  9. Clang 与 LLVM

    我们在iOS调试中经常会看到Clang这个,那么Clang到底是什么呢?我们来简单了解一下. Clang是一个C.C++.OC语言的轻量级编译器.源代码发布于BSD协议下.Clang是由C++编写,基 ...

  10. asp.net与MVC4的路由原理和过程【学习笔记】

    当IIS收到一个http请求,把请求信息发给对应的HttpModel(实际是实现类UrlRoutingModule),在HttpModel中会注册HttpApplication 类中的PostReso ...