如何为一个wxWidgets OpenGL程序启用多重采样?

3

多重采样 是在 3D 应用程序中应用全屏抗锯齿 (FSAA) 的一种方法。我需要在我的 OpenGL 程序中使用多重采样,该程序目前嵌入在 wxWidgets GUI 中。是否有方法可以实现这一点?如果您知道详细的步骤,请回答。

我知道可以使用WGL(OpenGL 的 Win32 扩展)启用多重采样。但是,由于我的 OpenGL 程序没有使用 MFC 编写(我希望代码具有多平台可移植性),所以这对我来说不是一个选项。

1个回答

4
我终于让我的wxWidgets OpenGL程序支持了多重采样。现在还有点混乱,但是下面是方法:
wxWidgets目前(截至本文发布时)的稳定版本(最新版本为2.8.8)不支持多重采样。但是,它可以通过补丁和每日快照获得支持。(后者令人振奋,因为这意味着该补丁已被接受,如果没有问题,应该会出现在以后的稳定版本中。)
所以,有两个选择:
  1. 每日快照下载并构建。
  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中,这将使得这些信息变得无关紧要 :-)


在wxWidgets 3.0.2上,这可以无需打补丁就能正常工作。谢谢,这解决了我的问题。 - kshepherd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接