QOpenGLFunctions_4_3_与QOpenGLContext :: versionFunctions的兼容性

Fra*_*eto 5 c c++ opengl qt

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

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

@ terraintessellationscene.h:

QOpenGLFunctions_4_3_Compatibility* m_funcs;
Run Code Online (Sandbox Code Playgroud)

@ terraintessellationscene.cpp:

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

当我调用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();
Run Code Online (Sandbox Code Playgroud)

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

更新4:最终解决方案

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

rat*_*eak 0

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

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

窗口.cpp第24行

format.setProfile( QSurfaceFormat::CompatibilityProfile);
Run Code Online (Sandbox Code Playgroud)

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