在wxGLCanvas上调整大小之前无法初始化着色器

时间:2013-07-22 07:29:34

标签: c++ opengl wxwidgets

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

m_context = new wxGLContext(this);

也尝试过:

SetCurrent(*m_current);

仍然没有运气,GLEW不断投掷“Missing GL Version”,表明尚未创建上下文(来自Google)。

我试过了:

  1. 使用WX_EVT()显示和激活事件,仍然没有运气。
  2. 在调整大小事件中初始化着色器,仍然没有运气。
  3. 有没有办法让wxGLCanvas先调用我的初始化函数?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

我这样做:

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

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

  • 显示窗口

    frame->Show()

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

  • 设置上下文

    wxGLCanvas::SetCurrent(*m_context);

  • 初始化glew:

    glewExperimental = GL_TRUE;

    GLenum err = glewInit();

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