其实OpenGL的全屏抗锯齿就是开启多重采样。在使用glut的时候,很方便就能实现。只要启用多重采样缓冲就行了。但是,在MFC窗口中的实现就很麻烦了。
首先,在MFC窗口中渲染OpenGL就需要比较麻烦的设置。所以,需要在设置OpenGL渲染环境的时候进一步处理。具体的来看下面一段代码吧。
这段代码就是MFC窗口创建的时候,设置OpenGL渲染环境的代码。
对于没有启用多重采样的情况,思路是先获取DC,然后调用ChoosePixelFormat获取最佳像素格式,再调用SetPixelFormat设置像素格式,接着调用wglCreateContext创建OpenGL渲染环境,最后调用wglMakeCurrent设置OpenGL渲染环境。
如果启用了多重采样,代码逻辑就更加复杂了。最恶心的一点是窗口必须创建2次。第一次按照常规思路设置好OpenGL渲染环境,然后调用函数InitMultisample判断是否支持多重采样,如果支持则销毁窗口,重新创建一次。第二次的思路是按照多重采样初始化得到的像素格式设置好OpenGL渲染环境的像素格式,其余的设置和常规的一样。具体参见下面的代码。
1 | BOOL COglWnd::SetupGLContext() |
那么函数InitMultisample是怎么来的了。NeHe刚好有一节课是讲这个的,我是从那里下载得到的。该函数代码如下。
1 | // InitMultisample: Used To Query The Multisample Frequencies |
该函数的使用还是很简单的,基本上是修改了2个全局变量,arbMultisampleSupported判断是否支持多重采样,arbMultisampleFormat则是对应的像素格式。我在代码中注释了一行:WGL_SAMPLES_ARB,16,//16设置了抗锯齿的质量。这里貌似可以修改数字的大小,据说一般显卡都支持到16,16的情况下,抗锯齿很好了,4的话效果一般般。这个函数相关的完整代码可以从NeHe下载。
至于完整代码,可以参考我上一篇文章,然后将这一篇文章的代码加进去即可。
未抗锯齿的效果:
抗锯齿的效果: