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

时间:2008-08-22 01:16:27

标签: opengl wxwidgets multisampling

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

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

1 个答案:

答案 0 :(得分:4)

我终于使用了我的wxWidgets OpenGL程序进行Multisampling。现在有点乱,但这是如何:

wxWidgets 目前在稳定版本中没有多重采样支持(此时最新版本 2.8.8 )。但是,它可以作为补丁,也可以通过他们的每日快照获得。 (后者令人振奋,因为这意味着补丁已被接受,如果没有问题,应该出现在以后的稳定版本中。)

所以,有两个选择:

  1. daily snapshot 下载并构建。

  2. 为您正在运行的wxWidgets安装获取 patch

  3. 我发现第二个选项不那么麻烦,因为我不想尽可能地打扰我的工作装置。如果您不知道如何在Windows上进行修补,请参阅this

    至少,对于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的稳定版本中得到支持,使这些信息无关紧要: - )