wxGLCanvas似乎讨厌OpenGL着色器,因为它没有像Qt那样提供初始化回调函数;即使在构造函数中自己创建了上下文之后,也无法创建着色器,如下所示:
m_context = new wxGLContext(this);
也尝试过:
SetCurrent(*m_current);
仍然没有运气,GLEW不断投掷“Missing GL Version”,表明尚未创建上下文(来自Google)。
我试过了:
有没有办法让wxGLCanvas先调用我的初始化函数?
答案 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()