Windows 7 64位,Qt 4:glGetVersion 返回 "1.1.0",nvogl32v.dll 被卸载
Windows 7 64bit, Qt 4: glGetVersion returns "1.1.0", nvogl32v.dll gets unloaded
情况
我正在开发使用 Qt 4 的 32 位应用程序,并且正在开发 Windows 7 64 位。
我的程序有主要的非OpenGL小部件,以及由用户选择打开的QGLWidget。
问题:
当我创建该QGLWidget
时,glGetVersion
报告"1.1.0"(我的硬件支持 OpenGL 4.3.0(。因此,我需要的许多功能根本不起作用(显然,因为它们在 OpenGL 1 中不可用(。此问题"有时"发生。
附加信息
如果我使用 gDebugger 启动程序,一切正常,glGetVersion 按预期返回"4.3.0"。添加此行:
QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags();
在 main(( 函数的开头也解决了这个问题。
该应用程序在 WinXP 32 位上运行良好。
我在 2..3 年前为这个应用程序编写了 OpenGL 子系统,使用它的人说他们在虚拟机(Win7 或 vista guest(上遇到了类似的问题,但我不记得当时我是如何处理这个问题的。
OpenGL 初始化
OpenGL初始化由Qt 4执行,没有glew或额外的库,使用QGLWidget。
程序中只有一个QGLWidget。准确地说,有一个从 QGLWidget 派生的类,它的初始化如下所示:
DisplayWidget::DisplayWidget(QWidget* parent)
: QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), parent)
系统配置:
操作系统:视窗7 64位。
编译器:MSVC2008表示 SP1。
Qt:Qt 4.8.1(使用MSVC2008从支持OpenSSL的源代码编译(。Windows SDK:Windows Server 2008 和 .NET 3.5。GPU: GeForce 460 GTX
问题:
可能导致此问题的原因是什么?
--更新--
"神奇修复"(OpenGLVersionFlags(在完全重建后已停止工作,现在应用程序不断初始化软件渲染器,即使使用gDebugger启动也是如此。
我机器上的所有其他 OpenGL 应用程序都可以正常工作,并且可以使用着色器。
我使用最新的驱动程序。
有什么想法吗?
--更新--
经过一些测试,我发现谷歌浏览器和蒸汽客户端以某种方式影响了所有使用OpenGL的Qt应用程序。
如果我打开了谷歌浏览器和Steam,最终所有程序都将停止正常工作,并且将无法再获得硬件加速OpenGL。
如果我关闭谷歌浏览器并保持 steam 打开,则每次尝试启动硬件加速程序都会失败。
如果我同时关闭 steam 和 chrome,那么每个程序启动都会成功。
为什么会这样?
--更新--
我已经通读了调试器输出,发现了一个非常有趣的事情:
'vdclient.exe': Loaded 'C:WindowsSysWOW64nvoglv32.dll'
First-chance exception at 0x777f47a5 (ntdll.dll) in vdclient.exe: 0xC0000005: Access violation reading location 0x05aa9000.
'vdclient.exe': Unloaded 'C:WindowsSysWOW64nvoglv32.dll'
基本上,当加载 nvoglv32.dll 时,"某些东西"在某处乱窜(调试器对此事件没有反应,顺便说一下(,系统决定卸载 nvoglv32.dll。从它的名字来看,它是 nvidia 系统/驱动程序组件,没有这个组件就没有硬件加速。
当 opengl 正常工作时,日志的这一部分如下所示:
'vdclient.exe': Loaded 'C:WindowsSysWOW64nvoglv32.dll'
'vdclient.exe': Loaded 'C:WindowsSysWOW64ntmarta.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:WindowsSysWOW64Wldap32.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:WindowsSysWOW64powrprof.dll', Symbols loaded (source information stripped).
The thread 'Win32 Thread' (0x1744) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1740) has exited with code 0 (0x0).
'vdclient.exe': Unloaded 'C:WindowsSysWOW64powrprof.dll'
The thread 'Win32 Thread' (0x1748) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x174c) has exited with code 0 (0x0).
'vdclient.exe': Loaded 'C:WindowsSysWOW64uxtheme.dll', Symbols loaded (source information stripped).
想法?
+ QGLFormat.setProfile 指定 OpenGL 版本?
QGLFormat glFormat;
glFormat.setVersion( 3, 2 );
glFormat.setProfile( QGLFormat::CoreProfile );
glFormat.setSampleBuffers( true );
QGLWidget w( glFormat );
另一个潜在的问题。应在 QGLWidget.initializeGL()
方法中初始化 OpenGL 上下文后调用glGetVersion
。
好吧,我放弃了。
我会将其标记为驱动程序错误或谷歌浏览器不兼容。
我将把这个怪癖|问题添加到项目的自述文件中,并确保即使模拟了 OpenGL,应用程序也能正常工作(即不显示工件(。
OpenGL 3.0 及更高版本具有针对旧功能的弃用模型。在旧的OpenGL版本中,新版本是旧版本的超集。也就是说,如果你想要OpenGL 1.5上下文并获得OpenGL 2.0上下文,那很好。一旦删除旧功能的可能性出现,就不再可行。进行了扩展WGL_ARB_create_context
:它公开了一个替换wglCreateContext
的新功能。与wglChoosePixelFormatARB
非常相似,它为系统增加了一个可扩展性机制,使得扩展上下文创建的选项成为可能。如果不使用此函数,就不可能创建OpenGL 3.2+核心配置文件上下文。
以下是有关如何创建OpenGL上下文的官方最新文档:http://www.opengl.org/wiki/Creating_an_OpenGL_Context_(WGL(
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 无法使用加载库卸载注入的 dll (C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 如何根据 DLL 端的请求卸载 DLL 模块以卸载它?
- 通知 Windows 系统应用程序字体已被卸载/删除
- 如何从目标进程卸载 DLL?
- 用于 OpenMP 4.5 卸载到 (GPU) 设备的 NVPTX GCC (9.0.0/trunk) 找不到 libg
- 卸载共享对象(.so 文件)在 C++ 中用 dlopen() 打开
- 按名称问题获取卸载应用程序路径
- 英特尔C++编译器 19.0 测试版中删除了对英特尔®图形技术的卸载支持
- libcoi_device.so.0 未找到英特尔 19.0.4 OpenMP 5.0 卸载编译错误
- OpenMP卸载到Nvidia错误还原
- 如何正确卸载DLL本身
- 卸载自身的 Linux 共享库
- 如何在Ubuntu 16.04中卸载PCL1.7
- cuda错误Cudart卸载(错误29)由于"driver shutting down"
- Windows 7 64位,Qt 4:glGetVersion 返回 "1.1.0",nvogl32v.dll 被卸载