C++ Windows 7 64位,Qt 4:glGetVersion返回;1.1.0“;,nvogl32v.dll被卸载

C++ Windows 7 64位,Qt 4:glGetVersion返回;1.1.0“;,nvogl32v.dll被卸载,c++,windows,opengl,qt4,windows-7-x64,C++,Windows,Opengl,Qt4,Windows 7 X64,形势 我正在开发使用Qt4的32位应用程序,我正在使用64位Windows 7 我的程序有主要的非OpenGL小部件和QGLWidget,用户可以选择打开它们 问题: 当我创建QGLWidget时,glGetVersion报告“1.1.0”(我的硬件支持OpenGL 4.3.0)。因此,我需要的许多功能根本无法工作(很明显,因为它们在OpenGL 1中不可用)。这个问题“有时”会发生 其他信息 若我使用gDebugger启动程序,一切正常,glGetVersion会像预期的那个样返回“4.3.0

形势

我正在开发使用Qt4的32位应用程序,我正在使用64位Windows 7

我的程序有主要的非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位上运行良好

3年前,我为这个应用程序编写了OpenGL子系统,使用它的人说他们在虚拟机(Win7或vista guest)上有类似的问题,但我不记得当时我是如何处理这个问题的

OpenGL初始化

OpenGL初始化由Qt4执行,没有glew或额外的库,使用QGLWidget

程序中只有一个QGLWidget。确切地说,有一个从QGLWidget派生的类,其初始化如下所示:

DisplayWidget::DisplayWidget(QWidget* parent)
    : QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), parent)
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\ntmarta.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\Wldap32.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\powrprof.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:\Windows\SysWOW64\powrprof.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:\Windows\SysWOW64\uxtheme.dll', Symbols loaded (source information stripped).
系统配置
操作系统:Windows 7 64位。
编译器:MSVC2008 express SP1。
Qt:qt4.8.1(使用MSVC2008从支持OpenSSL的源代码编译)。 WindowsSDK:WindowsServer2008和.NET3.5。 GPU:GeForce 460 GTX

问题

是什么导致了这个问题

--更新--

“神奇修复”(OpenGLVersionFlags)在完全重建后停止工作,现在应用程序不断初始化软件渲染器,即使是在使用gDebugger启动时

我的机器上的所有其他OpenGL应用程序工作正常,可以使用着色器

我使用最新的驱动程序

有什么想法吗

--更新--

经过一些测试,我发现google chrome和steam客户端以某种方式影响了所有使用OpenGL的Qt应用程序

如果我打开Google Chrome和Steam,最终所有程序都将停止正常工作,无法再获得硬件加速的OpenGL

若我关闭google chrome并保持steam打开,每第二次尝试启动硬件加速程序就会失败

如果我同时关闭steam和chrome,那么每个程序启动都会成功

为什么会发生这种情况

--更新--

我仔细阅读了调试器输出,发现了一件非常有趣的事情:

'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
First-chance exception at 0x777f47a5 (ntdll.dll) in vdclient.exe: 0xC0000005: Access violation reading location 0x05aa9000.
'vdclient.exe': Unloaded 'C:\Windows\SysWOW64\nvoglv32.dll'
基本上,当加载nvoglv32.dll时,“某物”在某处突然出现(顺便说一句,调试器对该事件没有反应),系统决定卸载nvoglv32.dll。从其名称来看,它是nvidia系统/驱动程序组件,没有该组件,就不会有硬件加速

当opengl正常工作时,日志的这一部分如下所示:

DisplayWidget::DisplayWidget(QWidget* parent)
    : QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), parent)
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\ntmarta.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\Wldap32.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\powrprof.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:\Windows\SysWOW64\powrprof.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:\Windows\SysWOW64\uxtheme.dll', Symbols loaded (source information stripped).

想法?

OpenGL 3.0及更高版本有一个旧功能的弃用模型。在旧的OpenGL版本中,新版本是旧版本的超集。也就是说,如果你想要OpenGL 1.5上下文,而获得OpenGL 2.0上下文,那就好了。一旦有可能删除旧功能,这就不再可行。扩展
WGL_ARB_create_context
:它公开了一个新函数来替换
wglCreateContext
。与
wglChoosePixelFormatARB
非常相似,它向系统添加了一个可扩展性机制,使得可以扩展上下文创建选项。如果不使用是功能


以下是有关如何创建OpenGL上下文的官方最新文档:

是否使用QGLFormat.setVersion+QGLFormat.setProfile指定OpenGL版本

QGLFormat glFormat;
glFormat.setVersion( 3, 2 );
glFormat.setProfile( QGLFormat::CoreProfile );
glFormat.setSampleBuffers( true );

QGLWidget w( glFormat );
另一个潜在问题。在
QGLWidget.initializeGL()
方法中初始化OpenGL上下文之后,应该调用
glGetVersion

好的,我放弃

我会将其标记为驱动程序错误或Google Chrome不兼容


我将把这个怪癖问题添加到project的自述文件中,并确保即使模拟OpenGL,应用程序也能正常工作(即不显示工件)。

“这个问题有时会发生。”。“这是什么意思?你能确定是什么原因引起的吗?你们的像素格式参数是什么?@Nicolas:有时候当我启动应用程序时,它会报告gl版本4.3.0。然而,在大多数情况下,当我正常启动它时(并且没有提到“神奇的QGLFormat补丁”),gl版本报告“1.1.0”。GPU驱动程序版本?您是否尝试重新安装驱动程序?我建议您从NVidia获取最新版本并安装,以排除任何驱动程序错误。@datenwolf:latest drivers—“320.18”。没有尝试重新安装,因为操作系统最近(不到两周前)是从头开始安装的。我怀疑这是Qt4错误,不是驱动程序错误,但我没有证据。是否有可能在windows平台上“偶然”创建仅OpenGL 1.1.0的上下文?我认为windows默认提供某种OpenGL仿真,这是相当有限的,而且仅限于OpenGL 1.1.0。然而,我不知道你需要做什么才能得到一个而不是硬件加速的OpenGL。@SigTerm:请求PFD_DRAW_to_位图像素格式将使你可靠地进入OpenGL-1.1模式。其他一些PFD配置也容易出现OpenGL版本下拉列表。但我怀疑这是你现在的问题。无意冒犯,但这与问题无关。因为没有任何更改的同一程序要么成功初始化并获得OPenGL 4+硬件加速上下文,要么无法正确初始化并获得由软件模拟的OPenGL 1.0上下文。这可能是特定于应用程序/驱动程序的行为