Home > front end >  How do I use Legacy OpenGL calls with QT6?
How do I use Legacy OpenGL calls with QT6?

Time:11-05

I'm new to Qt and am trying to import some older C openGL code. I'm currently using Qt 6.4. I've subclassed my OpenGL-using class to QOpenGlFunctions.

Many of the glFoo calls "work" but the class also uses calls like glEnableClientState, glVertexPointer, glNormalPointer, glTexCoordPointer, glDisableClientState, glColor4fv, & glMaterialfv which come up with errors like undefined reference to __imp_glTextCoordPointer. Looking at the documentation these appear to no long be supported by "default" but it looks like they are supported using older versions of QOpenGlFunctions such as QOpenGlFunction_1_4 (https://doc-snapshots.qt.io/qt6-dev/qopenglfunctions-1-4.html).

Trying to change my subclass from QOpenGLFunctions to QOpenGLFunctions_1_4 complains that really only QOpenGLFunctions_1_4_CoreBackend and QOpenGLFunctions_1_4_DeprecatedBackend exist but there appears to be no documentation on those and if I subclass to one of them I start seeing complaints about my constructor...

How do I actually access the functions from these older versions of the class?

CodePudding user response:

This question was answered by Chris Kawa over at the Qt Forums and it worked for me! Here is his answer:

OpenGL 3.1 introduced profiles. Core profile does not support these old functions and Compatibility profile does. So first you have to make sure you have a context in version either lower than 3.1 (which does not support profiles) or 3.1 and up set up to use Compatibility profile. AFAIK Qt does not support OpenGL < 3.1 anymore, so you only have the latter option. If you're not sure what context you have you can simply do qDebug() << your_context and it will print out all the parameters, or you can query individual fields of it e.g. your_conext->format()->profile(). If your context is not set correctly the simplest way is to set it up like this before any OpenGL is initialized in your app:

QSurfaceFormat fmt;
fmt.setVersion(3,1);
fmt.setProfile(QSurfaceFormat::CompatibilityProfile);
fmt.setOptions(QSurfaceFormat::DeprecatedFunctions);
QSurfaceFormat::setDefaultFormat(fmt);

When you have the correct context you can access the deprecated functions like this:

QOpenGLFunctions_1_4* funcs = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_1_4>(context());
if(funcs)
{
    //do OpenGL 1.4. stuff, for example
    funcs->glEnableClientState(GL_VERTEX_ARRAY);
}
else
{
    // Not a valid context?
}

And for anyone as amateur as I am, context() comes from QOpenGLWidget::context() which returns a QOpenGLContext*

  • Related