QOpenGLFunctions_4_3_与QOpenGLContext :: versionFunctions的兼容性

我正在尝试使用兼容性配置文件从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(); 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

在正确设置QSurfaceFormat(QOpenGLContext :: setFormat(格式)之后,似乎QOpenGLContext create()完全拒绝兼容性设置(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:最终解决方案

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

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

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

window.cpp第24行

 format.setProfile( QSurfaceFormat::CompatibilityProfile); 

并且只在创建上下文后调用versionFunctions