Search code examples
user-interfaceopenglwxwidgets

WxWidgets and modern opengl (3.3+)


Does anyone know if the WxWidgets library plays well with modern shader style openGL (3.3+)? All the stuff I found seems to be using the old style. I'm looking to use either QT or WxWidgets for my application, but it seems like getting shader stuff to work with widgets might be a nightmare. Does anyone have experience with this?


Solution

  • In wxWidgets >= 3.1 using wxGLContext with an appropriate Core-context wxGLContextAttrs ought to work:

    wxGLContextAttrs cxtAttrs;
    cxtAttrs.CoreProfile().OGLVersion(3, 3).EndList();
    

    As Ripi2 pointed out from the pyramid sample:

    //We create a wxGLContext in this constructor.
    //We do OGL initialization at OnSize().
    MyGLCanvas::MyGLCanvas(MyFrame* parent, const wxGLAttributes& canvasAttrs)
                           : wxGLCanvas(parent, canvasAttrs)
    {
        m_parent = parent;
    
        m_oglManager = NULL;
        m_winHeight = 0; // We have not been sized yet
    
        // Explicitly create a new rendering context instance for this canvas.
        wxGLContextAttrs ctxAttrs;
    #ifndef __WXMAC__
        // An impossible context, just to test IsOk()
        ctxAttrs.PlatformDefaults().OGLVersion(99, 2).EndList();
        m_oglContext = new wxGLContext(this, NULL, &ctxAttrs);
    
        if ( !m_oglContext->IsOK() )
        {
    #if wxUSE_LOGWINDOW
            wxLogMessage("Trying to set OpenGL 99.2 failed, as expected.");
    #endif // wxUSE_LOGWINDOW
            delete m_oglContext;
            ctxAttrs.Reset();
    #endif //__WXMAC__
            ctxAttrs.PlatformDefaults().CoreProfile().OGLVersion(3, 2).EndList();
            m_oglContext = new wxGLContext(this, NULL, &ctxAttrs);
    #ifndef __WXMAC__
        }
    #endif //__WXMAC__
    
        if ( !m_oglContext->IsOK() )
        {
            wxMessageBox("This sample needs an OpenGL 3.2 capable driver.\nThe app will end now.",
                         "OpenGL version error", wxOK | wxICON_INFORMATION, this);
            delete m_oglContext;
            m_oglContext = NULL;
        }
        else
        {
    #if wxUSE_LOGWINDOW
            wxLogMessage("OpenGL Core Profile 3.2 successfully set.");
    #endif // wxUSE_LOGWINDOW
        }
    
    }