1

wxGLCanvas 似乎讨厌 OpenGL 着色器,因为它没有提供像 Qt 中那样的初始化回调函数;即使在构造函数中自己创建了上下文之后,我也无法创建着色器,如下所示:

m_context = new wxGLContext(this);

也试过:

SetCurrent(*m_current);

仍然没有运气,GLEW 不断抛出“缺少 GL 版本”,这表明尚未创建上下文(来自 Google)。

我试过了:

  1. 使用 WX_EVT() 显示和激活事件,仍然没有运气。
  2. 在调整大小事件中初始化着色器,仍然没有运气。

有什么方法可以让 wxGLCanvas 先调用我的初始化函数?

4

2 回答 2

2

在 wxWidgets 中没有初始化 OpenGL 的特定方法,该方法在其他所有操作之前调用,但在窗口显示之后。您可以使用指示 OpenGL 是否已初始化的成员变量自行滚动,如果变量为 false,则在 Paint 事件处理程序中进行初始化。

根据我的经验,仅在 Paint 事件处理程序中发出所有 OpenGL 命令是最安全的,因此在您的 Size 事件处理程序中,您应该保存新的视口大小并更新您的 Paint 处理程序中的投影矩阵(或者只使用 wxGLCanvas 查询视口大小' GetClientRect() 方法)。

于 2013-07-22T18:26:17.783 回答
0

http://wiki.wxwidgets.org/WxGLCanvas的示例中,建议您对绘制事件 (EVT_PAINT(BasicGLPane::render)) 进行初始化,正如 Kristian Duske 在上面的评论中所说。

相反,您可以在任何其他地方初始化 OpenGL,您只需首先显示 wxwidget 窗口或框架(例如 frame->Show() )。

我这样做:

  • 初始化 wxGLCanvas(在我的情况下,使用 wxFrame 框架作为父级)

    canvas = new Canvas( (wxFrame*) frame, args);

  • 橱窗

    frame->Show()

现在在画布类中调用您的自定义 OpenGL 初始化方法(仅一次):

  • 设置上下文

    wxGLCanvas::SetCurrent(*m_context);

  • 初始化 glew:

    glewExperimental = GL_TRUE;

    GLenum err = glewInit();

在此之后,我编译着色器等。在绘画事件中,然后只做绘图:glDrawArrays()SwapBuffers()

于 2014-10-29T09:07:22.020 回答