我对Qt很陌生,正在尝试导入一些较旧的C++ openGL代码。我目前正在使用QT6.4。我已经将OpenGL子类化--使用类来实现QOpenGlFunctions。
许多glFoo调用"work“,但是该类也使用诸如glEnableClientState、glVertexPointer、glNormalPointer、glTexCoordPointer、glDisableClientState、glColor4fv和glMaterialfv之类的调用,这些调用会产生像undefined reference to __imp_glTextCoordPointer这样的错误。看一看这些文档,这些文档似乎不再被“默认”所支持,但似乎使用较早版本的QOpenGlFunctions (如QOpenGlFunction_1_4 (https://doc-snapshots.qt.io/qt6-dev/qopenglfunctions-1-4.html) )支持它们。
试图将我的子类从QOpenGLFunctions更改为QOpenGLFunctions_1_4,抱怨说实际上只有QOpenGLFunctions_1_4_CoreBackend和QOpenGLFunctions_1_4_DeprecatedBackend存在,但似乎没有关于它们的文档,如果我将子类转换为其中之一,我就会看到关于构造函数的抱怨。
我如何真正地访问这个类的这些旧版本的函数?
发布于 2022-11-01 21:28:27
克里斯·卡瓦在Qt论坛上回答了这个问题,它对我有用!以下是他的回答:
OpenGL 3.1引入了概要文件。核心配置文件不支持这些旧功能,兼容性配置文件也支持这些功能。因此,首先,您必须确保版本中的上下文低于3.1 (不支持配置文件),或者设置为使用兼容性配置文件。AFAIK不再支持OpenGL < 3.1,所以您只有后一个选项。如果您不确定您有什么上下文,只需执行qDebug() << your_context,它就会打印出所有参数,或者您可以查询其中的各个字段,例如您的_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()来自于返回QOpenGLContext*的QOpenGLWidget::context()
https://stackoverflow.com/questions/74280858
复制相似问题