QOpenGLFunctions_4_3_与QOpenGLContext :: versionFunctions的兼容性

时间:2014-05-21 09:37:21

标签: c++ c qt opengl

我正在尝试使用兼容性配置文件从http://www.kdab.com/opengl-in-qt-5-1-part-5/(包含源代码)编译Tesselation的示例,但它无法加载此配置文件:

我做过的次要(也是唯一)修改:

@ terraintessellationscene.h:

QOpenGLFunctions_4_3_Compatibility* m_funcs;

@ terraintessellationscene.cpp:

m_funcs = m_context->versionFunctions<QOpenGLFunctions_4_3_Compatibility>();
if ( !m_funcs )
{
    qFatal("Requires OpenGL >= 4.0");
    exit( 1 );
}
m_funcs->initializeOpenGLFunctions();

当我调用versionFunctions()时它就崩溃了。它应该工作。我可以使用任何Core Profile桌面配置文件编译此源和其他几个不同复杂程度的项目。我稍后会尝试使用GLEW来查看此问题是否与QT或我使用的QT或我的opengl驱动程序有关。

我正在使用AMD的14.4 WHQL。我试图使用预先构建的5.3源代码和5.3自编译的静态版本。我已经尝试了两个旧的AMD驱动程序,看看这是否是AMD提供的OpenGL软件包的问题,​​但它失败了。我真的想使用versionFunctions。

更新2

似乎QOpenGLContext create(),在正确设置QSurfaceFormat(QOpenGLContext :: setFormat(格式)之后,完全拒绝兼容性设置(format.setProfile(QSurfaceFormat :: CompatibilityProfile)并改为创建Core Profile上下文,完全忽略我对兼容性上下文的请求,但作为一个不能遵循QSurfaceFormat格式规则的成功操作返回true。

更新3

好吧,我刚刚发现了这个问题,它与我的修改无关,它位于kdab的原始代码中:

// Create an OpenGL context
m_context = new QOpenGLContext;
m_context->setFormat( format );
m_context->create();

通过在setFormat之前创建上下文,我能够正确启动正确的兼容性上下文,因为QT只是设置了与setProfile相关的部分设置(QSurfaceFormat :: CoreProfile)

更新4:最终解决方案

&#34;在setFormat()之前创建上下文是错误的,因为你要求的是一个简单的OpenGL 2.0上下文,驱动程序最有可能为你提供4.3兼容性。在其他驱动程序或平台上,这可能会失败所以要小心。 您看到的行为是由AMD驱动程序引起的:它拒绝创建正确的兼容性配置文件上下文,除非未设置前向兼容性集。 Qt默认设置fwdcompat位,可以通过在QSurfaceFormat上设置DeprecatedFunctions选项来关闭它。因此,与DeprecatedFunctions一起请求兼容性将提供您想要的。其他供应商的驱动程序没有这个问题,没有为兼容性配置文件忽略设置DeprecatedFunctions(即设置向前兼容性),因为它应该是。&#34; 通过agocs @ qt devnet

1 个答案:

答案 0 :(得分:0)

当您需要兼容性配置文件

时,您将获得核心配置文件(感谢Qt)

您应该在初始化时通过设置格式请求兼容性配置文件

window.cpp第24行

format.setProfile( QSurfaceFormat::CompatibilityProfile);

并且仅在创建上下文后调用versionFunction