OpenGL 3.0 不适用于 Windows 上的 Qt

Posted

技术标签:

【中文标题】OpenGL 3.0 不适用于 Windows 上的 Qt【英文标题】:OpenGL 3.0 Not working with Qt on Windows 【发布时间】:2017-03-23 23:56:39 【问题描述】:

我正在 Windows 上开发一个大量使用 OpenGL 的 Qt 项目。它最初配置为使用 OpenGL 2.1 版,一切正常。最近,我将代码中的OpenGL版本升级到了3.0。现在,项目在初始化期间很早就崩溃了,并出现以下错误:

QML debugging is enabled. Only use this in a safe environment.
ASSERT: "qGuiApp" in file kernel\qopenglcontext.cpp, line 1238
Debug Error!

Program: C:\Qt\5.7\msvc2015_64\bin\Qt5Cored.dll
Module: 5.7.0
File: global\qglobal.cpp
Line: 3063

ASSERT: "qGuiApp" in file kernel\qopenglcontext.cpp, line 1238

...这是调试器停止的行:

if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) 

在 global.cpp 中,它在该块的末尾失败。具体来说,错误信息中给出的行号对应于#endif这一行:

#ifndef QT_NO_EXCEPTIONS
/*
   \internal
   Allows you to call std::terminate() without including <exception>.
   Called internally from QT_TERMINATE_ON_EXCEPTION
*/
Q_NORETURN void qTerminate() Q_DECL_NOTHROW

    std::terminate();

#endif

查看 qopenglcontext.cpp,第 1238 行实际上是在一个大的注释块中。下面是直接跟随的代码,根据上面的错误消息(Q_ASSERT(qGuiApp) 行),几乎可以肯定这是正确的位置:

QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()

#if defined(QT_OPENGL_DYNAMIC)
    Q_ASSERT(qGuiApp);
    return QGuiApplicationPrivate::instance()->platformIntegration()->openGLModuleType();
#elif defined(QT_OPENGL_ES_2)
    return LibGLES;
#else
    return LibGL;
#endif 

请记住,这些是标准 Qt 文件,这是我从未接触过的代码。

这是我迄今为止尝试过的总结。当然,这些都不起作用:

尝试设置我的环境变量,如下页所示:http://doc.qt.io/qt-5/windows-requirements.html。具体来说,我将我的 QT_OPENGL var 设置为桌面、角度和软件,但没有任何效果。 按照同一页面的建议,我尝试在我的 .pro 文件中添加以下行:“LIBS += opengl32.lib”和“LIBS += -lopengl32”(我添加了一行,对其进行了测试,将其删除,然后添加了第二行。) 尝试取消设置 QT_OPENGL_DYNAMIC 变量。 下载并运行 OpenGL Extensions Viewer 4.1 并确认我的 OpenGL 存在并且设置得很好。渲染测试功能证明 OpenGL 在我的系统上正常运行。 还成功运行了 Qt 内置的 HelloWorld OpenGL 示例。这运行良好,确认 Qt 能够以其他方式运行 OpenGL。

我在这里没有想法。欢迎任何建议或知识。另外,如果您需要更多信息,请询问,我会及时回复。

编辑:这是主要的开始:

int main(int argc, char* argv[]) 
 
   // setup OpenGL before application initialization 
   GLFunctions::setupOpenGL(); 
   QApplication app(argc, argv);
   ....

这里是设置函数:

static void setupOpenGL()

    QSurfaceFormat fmt; 
    fmt.setDepthBufferSize( 24 ); 
    if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) 
     
        fmt.setVersion(3, 3); 
        fmt.setProfile(QSurfaceFormat::CoreProfile); 
        //fmt.setRenderableType(QSurfaceFormat::OpenGL); 
     
    else 
     
        fmt.setVersion(3, 0); 
    

【问题讨论】:

你只是没有通过断言。无论 qGuiApp 是什么,它都是空的。它在哪里初始化? 这是我的 main.cpp 的开头: int main(int argc, char* argv[]) // 在应用程序初始化之前设置 OpenGL GLFunctions::setupOpenGL(); QApplication 应用程序(argc,argv); ... 这是我的 setupOpenGL 函数: static void setupOpenGL() QSurfaceFormat fmt; fmt.setDepthBufferSize(24); if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) fmt.setVersion(3, 3); fmt.setProfile(QSurfaceFormat::CoreProfile); //fmt.setRenderableType(QSurfaceFormat::OpenGL); 其他 fmt.setVersion(3, 0);正如我原来的帖子所指出的,它在 if 语句上失败了。抱歉格式化,我不明白如何在这样的 cmets 中格式化代码。 您在 Qt 之前设置 OpenGL,但在 openGL 设置中使用 qGuiApp。所以 qGuiApp 将为空。 想想qGuiApp 是什么,为什么在你看到它为空的时候它是空的,以及它与你的代码有何关系。 【参考方案1】:

来自QOpenGLContext::openGLModuleType()的the documentation:

注意:此功能要求QGuiApplication实例已经创建。

无论openGLModuleType 是什么,您都可以设置您想要的版本(去掉勾选),稍后再检查您是否获得了您请求的版本。

【讨论】:

以上是关于OpenGL 3.0 不适用于 Windows 上的 Qt的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 代码适用于 Windows 但不适用于 Mac

蒸汽构建命令不适用于 Swift 3.0

OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于“常规”程序

OpenGL 纹理不适用于大于 1x1 的分辨率

formvalidation v1.3.0 不适用于 requirejs

OpenGL 4.1 不适用于 Mavericks