如何为wxWidgets OpenGL程序启用多重采样?
多重采样是在3D应用程序中应用全屏抗锯齿(FSAA)的一种方式。我需要在我的OpenGL程序中使用多重采样,该程序当前嵌入在wxWidgets GUI中。有没有办法做到这一点?仅当我们知道实现此目的的详细步骤时,请做出答复。
我知道使用WGL(OpenGL的Win32扩展)启用多重采样。但是,由于我的OpenGL程序不是用MFC编写的(并且我希望代码可以多平台移植),所以这不是我的选择。
解决方案
回答
我终于在我的wxWidgets OpenGL程序中使用了Multisampling。现在有点混乱,但是方法如下:
wxWidgets目前在其稳定版本中不支持多重采样(当前最新版本为2.8.8)。但是,它可以作为补丁程序使用,也可以通过他们的每日快照获得。 (后者令人振奋,因为这意味着该补丁已被接受,并且如果没有问题,应在以后的稳定版本中显示。)
因此,有2个选项:
- 从他们的每日快照下载并构建。
- 获取适用于wxWidgets安装的补丁程序。
我发现第二个选项不太麻烦,因为我不想尽可能多地打扰我的正常安装。如果我们不知道如何在Windows上打补丁,请参阅此内容。
至少,对于Windows,该修补程序将修改以下文件:
$(WX_WIDGETS_ROOT)/include/wx/glcanvas.h $(WX_WIDGETS_ROOT)/include/wx/msw/glcanvas.h $(WX_WIDGETS_ROOT)/src/msw/glcanvas.cpp
修补后,重新编译wxWidgets库。
要在wxWidgets OpenGL程序中启用多重采样,需要对代码进行较小的更改。
需要将属性列表传递给wxGLCanvas构造函数:
int attribList[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_SAMPLE_BUFFERS, GL_TRUE, // Multi-sampling WX_GL_DEPTH_SIZE, 16, 0, 0};
如果我们已经在使用属性列表,则将带有GL_SAMPLE_BUFFERS,GL_TRUE的行添加到其中。否则,将此属性列表定义添加到代码中。
然后修改wxGLCanvas构造函数以将此属性列表作为参数:
myGLFrame::myGLFrame // Derived from wxGLCanvas ( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxGLCanvas(parent, (wxGLCanvas*) NULL, id, pos, size, style, name, attribList) { // ... }
创建wxGLCanvas元素后,默认情况下会启用多重采样。要随意禁用或者启用它,请使用相关的OpenGL调用:
glEnable(GL_MULTISAMPLE); glDisable(GL_MULTISAMPLE);
现在,多重采样应该可以与wxWidgets OpenGL程序一起使用。希望它很快会在wxWidgets的稳定版本中得到支持,从而使此信息无关紧要:-)