首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在wxGLCanvas上调整大小之前初始化着色器时出错

在wxGLCanvas上调整大小之前初始化着色器时出错
EN

Stack Overflow用户
提问于 2013-07-22 07:29:33
回答 2查看 569关注 0票数 1

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

m_context = new wxGLContext(this);

也曾尝试过:

SetCurrent(*m_current);

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

我试过:

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

有什么办法让wxGLCanvas先调用我的初始化函数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-22 18:26:17

没有特定的方法来初始化在所有其他内容之前调用的OpenGL,而是在wxWidgets中显示窗口之后。您可以使用一个成员变量(该变量指示OpenGL是否已被初始化)滚动您自己的变量,如果该变量为false,则可以在画图事件处理程序中进行初始化。

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

票数 2
EN

Stack Overflow用户

发布于 2014-10-29 09:07:22

http://wiki.wxwidgets.org/WxGLCanvas中的示例中,建议您对EVT_PAINT事件(BasicGLPane::render)进行初始化,就像上面的注释中Kristian所说的那样。

相反,您可以在任何其他地方初始化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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17782108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档