Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在wxGLCanvas上调整大小之前初始化着色器时出现问题_C++_Opengl_Wxwidgets - Fatal编程技术网

C++ 在wxGLCanvas上调整大小之前初始化着色器时出现问题

C++ 在wxGLCanvas上调整大小之前初始化着色器时出现问题,c++,opengl,wxwidgets,C++,Opengl,Wxwidgets,wxGLCanvas似乎讨厌OpenGL着色器,因为它没有提供像Qt中那样的初始化回调函数;使我无法创建着色器,即使在自己在构造函数中创建了上下文,如下所示: m_context=新的wxGLContext(此) 还尝试: SetCurrent(*m_current) 仍然没有运气,GLEW不断抛出“缺少GL版本”,这表明上下文尚未创建(来自谷歌) 我试过: 使用WX_EVT()显示和激活事件,仍然没有运气 在resize事件中初始化着色器,仍然没有成功 有没有办法让wxGLCanvas先调用我

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

m_context=新的wxGLContext(此)

还尝试:

SetCurrent(*m_current)

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

我试过:

  • 使用WX_EVT()显示和激活事件,仍然没有运气
  • 在resize事件中初始化着色器,仍然没有成功

  • 有没有办法让wxGLCanvas先调用我的初始化函数?

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

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

    在中的示例中,建议您对paint事件(EVT_paint(BasicGLPane::render))进行初始化,正如Kristian Duske在上面的评论中所说

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

    我这样做:

    • 初始化wxGLCanvas(在我的例子中,wxFrame帧作为父帧)

      canvas=新画布((wxFrame*)框架,args)

    • 橱窗

      frame->Show()

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

    • 设置上下文

      wxGLCanvas::SetCurrent(*m_context)

    • 初始化glew:

      glewExperimental=GL\u TRUE

      GLenum err=glewInit()

    在此之后,我编译着色器等。
    在绘制事件中,然后仅绘制:
    glDrawArrays()
    SwapBuffers()

    我通常在绘制事件处理程序中进行初始化。我使用一个布尔成员变量来指示是否进行了初始化。@KristianDaske我以前做过,但在使用resize事件之后,它将不再工作,因为resize事件将首先被调用。为什么需要在resize事件之前初始化OpenGL?在paint handler中执行此操作对我来说非常有效,我也在使用GLEW。下面是一些代码,可能会有所帮助:因为在调整大小事件中,我需要根据新的窗口大小设置投影矩阵。我只需在调整大小处理程序中保存新的视口大小,并在绘制处理程序中更新矩阵。我认为,如果在调整大小处理程序中调用event.Skip(),GLCanvas将在调整大小后自动重新绘制自身。否则,您可以自己在调整大小处理程序中调用Redraw()。通常,我只在paint处理程序中发出所有OpenGL调用,如果我尝试在paint处理程序之外使用OpenGL,我在某些平台上遇到了奇怪的问题。谢谢你的回答。然而,这个问题已经很老了,我不再需要答案,所以我希望这能帮助其他人!