如何在QT6中使用传统OpenGL调用?

ijxebb2r  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(554)

我是Qt的新手,正在尝试导入一些旧的C++ openGL代码。我目前使用的是Qt 6.4。我已经将使用OpenGL的类子类化为QOpenGlFunctions
许多glFoo调用“work,”但该类也使用glEnableClientStateglVertexPointerglNormalPointerglTexCoordPointerglDisableClientStateglColor4fv等调用,& glMaterialfv,它会出现类似undefined reference to __imp_glTextCoordPointer的错误。查看文档,“default”似乎不再支持这些错误但是看起来使用QOpenGlFunctions的旧版本(例如QOpenGlFunction_1_4https://doc-snapshots.qt.io/qt6-dev/qopenglfunctions-1-4.html))可以支持它们。
尝试将我的子类从QOpenGLFunctions更改为QOpenGLFunctions_1_4时,会抱怨实际上只存在QOpenGLFunctions_1_4_CoreBackendQOpenGLFunctions_1_4_DeprecatedBackend,但似乎没有关于它们的文档,如果我将子类更改为其中一个,我会开始看到关于我的构造函数的抱怨...
我实际上如何从这些旧版本的类中访问函数?

s4n0splo

s4n0splo1#

Qt ForumsChris Kawa回答了这个问题。以下是他的答案:

  • OpenGL 3.1引入了配置文件。核心配置文件不支持这些旧功能,兼容性配置文件支持。因此,首先您必须确保您的上下文版本低于3.1(不支持配置文件)或3.1及以上版本设置为使用兼容性配置文件。AFAIK Qt不再支持OpenGL〈3.1,因此您只有后一种选择。()〈〈your_context,它将打印出所有参数,或者您可以查询它的单个字段,例如your_conext-〉format()-〉profile()。如果您的上下文设置不正确,最简单的方法是在应用中初始化任何OpenGL之前进行如下设置:*
QSurfaceFormat fmt;
fmt.setVersion(3,1);
fmt.setProfile(QSurfaceFormat::CompatibilityProfile);
fmt.setOptions(QSurfaceFormat::DeprecatedFunctions);
QSurfaceFormat::setDefaultFormat(fmt);
  • 当您有正确的上下文时,您可以像这样访问已弃用的函数:*
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?
}

对于像我这样的业余爱好者来说,context()来自QOpenGLWidget::context(),它返回QOpenGLContext*

相关问题