Qt for Windows - 图形加速
要使 Qt Quick工作,需要支持 Direct 3D 11、Direct3D 12、Vulkan 1.0 或 OpenGL 2.1 或更高版本的图形驱动程序。从 Qt 6 开始,Windows 上Qt Quick 的默认设置为 Direct3D 11。这与 Qt 5 不同,Qt 5 默认使用 OpenGL,可以直接使用,也可以通过 ANGLE(OpenGL 到 Direct3D 的转换器)使用。在 Qt 6 中,ANGLE 不再随 Qt 一起提供。
要强制使用 Direct3D 的软件光栅化器 (WARP),请将环境变量QSG_RHI_PREFER_SOFTWARE_RENDERER
设为1
。在某些情况下,Qt Quick 会自动执行这种回退,以便无需额外配置即可运行 Qt 应用程序。当驱动程序不能提供足够级别的 D3D11 功能时,就会出现这种情况,通常发生在没有实施适当 GPU 加速和直通的虚拟机中。如果对所使用的图形设备有疑问,以及在排除故障或向 Qt 报告问题时,可在设置环境变量QSG_INFO=1
的情况下运行应用程序,并检查调试输出。运行qtdiag
工具也能提供有用的信息,因为它会列举所有可用的 3D API。
要请求使用 Vulkan、OpenGL 或 Direct 3D 12,请将环境变量QSG_RHI_BACKEND
设置为vulkan
或opengl
或d3d12
,或使用main()
中的相应C++ API 。请注意,其中一些 3D API 可能需要安装相应的驱动程序。
虽然 Qt Quick的默认设置,但在许多 Qt 应用程序中,例如在基于QWidget 的应用程序中,OpenGL 仍被普遍使用,这些应用程序是在QOpenGLWindow 或QOpenGLWidget 上构建的。以下章节将介绍 Qt 构建中 OpenGL 的一些具体细节。
动态加载 OpenGL
Qt 支持在运行时选择并加载 OpenGL 实现。这种模式是默认的,也可以通过向 configure 脚本传递-opengl dynamic
来显式请求。
configure -opengl dynamic
这种配置是最灵活的,因为在构建过程中不会对 OpenGL 实现硬编码依赖关系或假设。它允许稳健的应用部署。当特定环境无法提供合适的 OpenGL 2.0 实现时,它会自动加载opengl32.dll
的替代方案,其默认名称为opengl32sw.dll
。Qt OpenGL 的软件光栅化软件实现 Mesa llvmpipe 的预编译包就是以此为名。
当配置为-opengl dynamic
时,Qt 或使用qmake
或CMake
构建的应用程序都不会链接到 opengl32.lib。而是在运行时选择并加载该库。默认情况下,Qt 将确定系统的 opengl32.dll 是否提供 OpenGL 2 功能。如果存在,则使用 opengl32.dll,否则将尝试加载opengl32sw.dll
。详见下文。
加载机制可通过QT_OPENGL
环境变量和以下应用程序属性进行配置:
Qt::AA_UseDesktopOpenGL
相当于将 设置为 。QT_OPENGL
desktop
Qt::AA_UseOpenGLES
在 Qt 6 中无效。Qt::AA_UseSoftwareOpenGL
相当于将 设置为 。QT_OPENGL
software
如果明确请求某种配置,则在启动应用程序时不会进行任何检查,即不会检查系统提供的 opengl32.dll。
动态加载对包含本地 OpenGL 调用的应用程序有很大影响:由于没有自动向链接器指定 opengl32.lib,它们可能无法链接。相反,应用程序应通过QOpenGLFunctions 类使用 OpenGL 函数。这样就消除了对 OpenGL 库的直接依赖,所有调用都将在运行时路由到 Qt 选择的实现方式。另外,如果应用程序在其 .pro 项目文件中添加 opengl32.lib,也可以直接调用 OpenGL 函数:LIBS += opengl32.lib(Visual Studio) 或LIBS += -lopengl32(Mingw-w64)。从应用程序的角度来看,其结果相当于 Qt 的-opengl desktop
构建配置。
Qt::AA_UseSoftwareOpenGL
在 "OpenGL "中,"OpenGL "的特殊之处在于它会尝试加载一个非标准名称的 OpenGL 实现。默认名称是 。这样就能以该名称加载纯软件 OpenGL 实现,例如opengl32sw.dll
使用 llvmpipe 的 Mesa 版本。如有必要,可通过设置 环境变量来覆盖文件名。QT_OPENGL_DLL
可以提供一个 JSON 格式的配置文件,指定根据显卡和驱动程序版本使用哪种 OpenGL 实现。配置文件的位置由环境变量QT_OPENGL_BUGLIST
提供。相对路径使用QLibraryInfo::SettingsPath
或QStandardPaths::ConfigLocation
解析。该文件采用了Chromium 项目中使用的驱动程序错误列表格式。它由一系列条目组成,每个条目指定一组条件和一系列特征关键字。通常,设备 id 和供应商 id 用于匹配特定显卡。它们可以在qtdiag6
或dxdiag
工具的输出中找到。
以下特征关键字与选择 OpenGL 实现相关:
注意: 在 Qt XML 6 中,传统的 ANGLE 相关关键字 (disable_angle
,disable_d3d11
,disable_d3d9
) 被接受,但没有影响。
disable_desktopgl
- 禁用 OpenGL。这将确保 Qt 不会尝试使用常规的 OpenGL (opengl32.dll),而是立即使用 ANGLE 启动。这对于防止不良 OpenGL 驱动程序导致应用程序崩溃非常有用。disable_rotation
- 强制应用程序始终横向运行。在使用软件 OpenGL 实现时没有影响。这适用于在旋转方面有问题的驱动程序。disable_program_cache
- 禁止在磁盘上存储着色器程序二进制文件。
示例文件如下
{ "entries": [ { "id": 1, "description": "Disable D3D11 on older nVidia drivers", "os": { "type": "win" }, "vendor_id": "0x10de", "device_id": ["0x0DE9"], "driver_version": { "op": "<=", "value": "8.17.12.6973" }, "features": [ "disable_d3d11" ] }, ...
未指定QT_OPENGL_BUGLIST
时,将使用内置列表。这通常包括一些设置了disable_desktopgl
的较老的、性能较差的显卡,以防止 Qt 使用它们不稳定的桌面 OpenGL 实现,而是退回到尝试立即加载基于软件的替代库。
在实践中,最常见的组合预计如下:
disable_desktopgl
- 如果系统提供 OpenGL 2.0 或更新的版本,但已知驱动程序不稳定且容易崩溃,则应使用以下组合disable_desktopgl
, disable_angle - 不需要加速路径时。这将确保 Qt 尝试的唯一选项是软件光栅器(opengl32sw.dll)。这在虚拟机和应用程序部署到各种旧系统上时非常有用。
用于匹配特定显卡或驱动程序的支持键如下。请注意,其中有些是 Qt 特有的。
os.type
- 操作系统:, , 、win
linux
macosx
android
os.version
- 内核版本os.release
- 指定 Windows 操作系统版本列表:, , , , , 。xp
vista
7
8
8.1
10
vendor_id
- 来自适配器标识符的供应商device_id
- PCI 设备 ID 列表。driver_version
- 来自适配器标识符的驱动程序版本driver_description
- 当值为适配器标识符中驱动程序描述的子串时匹配gl_vendor
- 当值为 字符串的子串时匹配。GL_VENDOR
要禁用所有黑名单,可将环境变量QT_NO_OPENGL_BUGLIST
设置为任意值。这将跳过读取任何配置文件,而是假定没有禁用任何功能,无论驱动程序或操作系统如何。
注意: 虽然通常不需要QT_NO_OPENGL_BUGLIST
,但在某些存在多个(可能是虚拟的)图形适配器的虚拟环境中,它可能会变得很重要。如果来自qt.qpa.gl
等类别的日志显示,对驱动程序和显示适配器的检测导致错误禁用 OpenGL,则建议设置此环境变量,以使应用程序正常运行。此环境变量在 Qt 5.15 中引入。
直接依赖 opengl32.dll
除了默认的dynamic
OpenGL 生成模式外,还有一种直接依赖 opengl32.dll 的模式。对于这种模式,请将命令行选项-opengl desktop
传递给 configure 脚本。
configure -opengl desktop
注意: Windows 系统不支持使用 EGL 和 OpenGL ES。在 Qt 6 中,Windows 上的 OpenGL 总是意味着使用 WGL 作为窗口系统接口。
在此类 Qt 构建中,许多 Qt 共享库和 Qt 应用程序都依赖于 opengl32.dll,因此无法使用其他库。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.