【发布时间】:2014-04-03 17:10:59
【问题描述】:
我需要在 Windows 7 上的 Qt5 项目中使用 OpenGL 版本 2 功能(Qt 是使用桌面 OpenGL 而不是 ANGLE 构建的)。为了支持通过远程桌面运行应用程序,我想在必要时通过 Mesa 进行软件渲染。我的计划是在启动时检查 OpenGL 版本。如果它太低,我在应用程序设置中设置一个标志,打印一条消息并终止程序。当程序再次启动时,我可以读取标志并决定是否需要从 Mesa 加载 opengl32.dll 而不是 Windows 的内置版本。
为了让它工作,我尝试延迟加载 opengl32.dll,方法是设置 /DELAYLOAD:opengl32.dll 链接器标志,然后使用 SetDllDierectoryW([path to dir with Mesa's opengl32.dll]) 重定向 dll 查找。不幸的是,这不起作用,因为 opengl32.dll 的内置版本在输入 main() 后已经在内存中,因此 SetDllDirectory 无效。
Dependency Walker 向我展示了 Qt5Gui.dll 本身与 opengl32.dll 相关联,我怀疑这会破坏延迟加载。但是,当我尝试延迟加载 Qt5Gui.dll 时,链接器由于导入的符号 "__declspec(dllimport) public: static struct QMetaObject const QWindow::staticMetaObject" (__imp_?staticMetaObject@QWindow@@2UQMetaObject@@B) 而失败。我不知道如何摆脱它。
我真的需要 OpenGL 2,所以似乎没有办法使用 Mesa 进行软件渲染。但我也想不出延迟加载的替代方案。每当我想在硬件和软件渲染之间切换时更改 PATH 设置似乎不起作用,并且通过将 Mesa 的 opengl32.dll 移入或移出应用程序目录进行切换不是一个选项,因为普通用户不应该有所需的写入权限。
有什么方法可以延迟加载使用 Qt5 的 opengl32.dll?
【问题讨论】:
-
让您的 QT 应用程序在一开始就使用
LoadLibrary加载您自己的OpenGL32.dll。知道应用程序只能加载一个指定名称的模块,它将无法加载 system32 中的模块,因为它已经加载了您的模块。如果应用程序静态链接OpenGL32,您将遇到困难,可能不得不求助于挂钩。 -
没有使用 OpenGL 的 Qt5 包没有选项吗?我不确定,但我记得看到标有 Qt 5.2 OpenGL 之类的版本和一个没有 OpenGL 的版本。
-
@Skali 使用非 openGL 版本的 Qt 不是一个选项,因为我依靠
OpenGLSurface来绘制QWindow并且我正在使用像QOpenGLShaderProgram这样的所有好帮手和朋友。 @CantChooseUsernames 不幸的是,LoadLibrary也不起作用,因为Qt5Gui.dll似乎导致系统opengl32.dll在加载时被链接,所以当调用main()时,所有的伤害都已经完成。有哪些钩子可以提供帮助的想法? -
我不知道这需要付出多少努力,但是你能改变 Qt 源代码中 opengl32.dll 的链接吗?我没有在一个项目中使用过 OpenGL 和 Qt(仅分别)。
-
为什么不使用软件渲染来渲染纹理,然后将其传递给内置的 OpenGL 库? (在四边形上渲染纹理基本上是任何 OpenGL 中的保证功能)
标签: c++ windows opengl qt5 mesa