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

标签 opengl wxwidgets multisampling

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

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

最佳答案

我终于在我的 wxWidgets OpenGL 程序中使用了多重采样。现在有点乱,但方法如下:

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

所以,有两个选择:

  1. 从他们的 下载并构建 daily snapshot .

  2. 获取 patch 为您的工作 wxWidgets 安装。

我发现第二个选项不那么麻烦,因为我不想尽可能多地打扰我的工作安装。如果您不知道如何在 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 的稳定版本中得到支持,使这些信息无关紧要:-)

关于opengl - 如何为 wxWidgets OpenGL 程序启用多重采样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560/

相关文章:

iphone - 如何在 iPhone 上激活 OpenGL ES 中的多重采样?

opengl - 超越人脸检测-OpenCV

c - 如何使用 OpenGL 将正方形居中?

c++ - 从 GtkWidget 获取 X11 窗口句柄

python - wxPython "Library not loaded"

opengl - 使用glBlitFramebuffer进行多重采样

Opengl:错误(#97)找不到程序主程序

opengl - 如何调试 GLSL 着色器?

c++ - wxWidgets 程序段错误

c++ - Direct X 11 锯齿状边缘