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

本文关键字:卸载 nvogl32v dll glGetVersion 64位 Qt Windows 返回      更新时间:2023-10-16

情况

我正在开发使用 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.setVersion

+ 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(