Qt:如何检测正在使用的OpenGL版本?

16
有几种方式可以让Qt使用OpenGL:桌面(本地)、ANGLE、ES...现在还有“动态”的方式可以在运行时选择。在应用程序中,有没有一种方法可以检测正在使用哪种方式?可以在C++或QML中进行检测吗?
例如,类似于全局声明的东西,让您可以检测操作系统。

4
glGetString(GL_VERSION)? - genpfault
1
一般来说,当你明确地不关心时,你会使用“动态”。也就是说,你正在编写 ANGLE 和桌面 GL 之间的最低公共分母。那么你为什么需要问这个问题呢? - Nicol Bolas
2
英特尔通常意味着“升级驱动程序”。您可以通过许多方法确定您拥有的上下文版本:前面提到的GL_VERSION;在Qt Quick中使用OpenGLInfo;使用QOpenGLContext::openGLModuleType() - peppe
2
有没有一种全局的方法可以强制在所有Windows设备上使用ANGLE?您可以只使用ANGLE支持重新构建Qt,或者如果您想使用动态构建,在创建Q(Gui)Application之前设置Qt :: AA_UseOpenGLES - peppe
1
我发现这个链接很有帮助: http://blog.qt.io/blog/2017/01/18/opengl-implementation-qt-quick-app-using-today/ - user12345
显示剩余4条评论
1个回答

16

检测OpenGL版本:

如果要强制使用特定的OpenGL版本:

  • 在软件中设置选项(请参见下面的代码示例):
    • 对于桌面/本地环境,请将环境变量QT_OPENGL设置为desktop或将应用程序属性设置为Qt::AA_UseDesktopOpenGL
    • 对于ANGLE,请将环境变量QT_OPENGL设置为angle或将应用程序属性设置为Qt::AA_UseOpenGLES
    • 对于软件渲染,请将环境变量QT_OPENGL设置为software或将应用程序属性设置为Qt::AA_UseSoftwareOpenGL
  • 使用configure选项创建Qt的静态构建,以设置所需的OpenGL实现(但要注意Qt许可证规则
    • 对于桌面/本地环境,请包含-opengl desktop
    • 对于ANGLE,请不要包含-opengl选项;这是因为它是默认值
    • 还有-opengl dynamic,它让Qt选择最佳选项。这是在Qt 5.4中引入的。如果您想使用此选项,但无需出于任何其他原因创建静态构建,则无需创建静态构建,因为自Qt 5.5以来的预构建二进制文件都使用此选项。
    • 您还可以探索其他变体,详细信息请参见Qt for Windows - 要求。尽管这是一个特定于Windows的页面,但包含了有关配置OpenGL用于Qt的大量信息。(可能是因为大部分OpenGL渲染问题都发生在Windows平台上!)

代码示例

#include <QGuiApplication>
//...

int main(int argc, char *argv[])
{
    // Set the OpenGL type before instantiating the application
    // In this example, we're forcing use of ANGLE.

    // Do either one of the following (not both). They are equivalent.
    qputenv("QT_OPENGL", "angle");
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);

    // Now instantiate the app
    QGuiApplication app(argc, argv);
    //...

    return app.exec();
}

(感谢 peppe 提供的上面评论中的初始答案,以及感谢user12345提供的博客链接)


glGetString(GL_VERSION) 在我的一台机器上(搭载Intel HD 3000)返回0,OpenGL无法显示,尽管另一张显卡的OpenGL测试应用程序可以显示渲染场景。我该怎么办? - falkb
我也有搭配Win10的Intel HD 3000显卡(驱动版本9.17.10.3347,日期为2013年10月31日),让我的QML应用程序不崩溃的唯一方法是从这里下载Mesa软件渲染器的opengl32.dll: https://fdossena.com/?p=mesa/index.frag。我只需将opengl32.dll复制到我的qml_app.exe旁边,最终它成功运行而没有崩溃。 - Michal Fapso
我也尝试了更新的驱动程序9.17.10.4229 5-26-2015,但它也会崩溃。 - Michal Fapso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接