wxGLCanvas 似乎讨厌 OpenGL 着色器,因为它不提供像 Qt 中那样的初始化回调函数;即使在构造函数中自己创建上下文后,我也无法创建着色器,如下所示:
m_context = new wxGLContext(this);
还试过:
SetCurrent(*m_current);
仍然没有运气,GLEW 不断抛出“缺少 GL 版本”,这表明上下文尚未创建(来自 Google)。
我试过:
- 使用 WX_EVT() 显示和激活事件,仍然没有成功。
- 在调整大小事件中初始化着色器,仍然没有运气。
有没有办法让wxGLCanvas先调用我的初始化函数?
最佳答案
在 wxWidgets 中,没有特定的方法来初始化 OpenGL,该方法在其他所有事情之前被调用,而是在窗口显示之后被调用。您可以使用指示 OpenGL 是否已初始化的成员变量自己滚动,如果该变量为假,则在 Paint 事件处理程序中进行初始化。
根据我的经验,仅在 Paint 事件处理程序中发出所有 OpenGL 命令是最安全的,因此在您的 Size 事件处理程序中,您应该保存新的视口(viewport)大小并更新 Paint 处理程序中的投影矩阵(或仅查询视口(viewport)使用 wxGLCanvas 的 GetClientRect() 方法调整大小)。
关于c++ - 在 wxGLCanvas 上调整大小之前无法初始化着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17782108/