visual c++-在新视频卡上的nvoglv32.dll中的draw调用时崩溃



几天前,由于硬件发生了一些更改,我安装了一台新的Windows 8。除此之外,我将视频卡从Radeon HD 7870更改为Nvidia GTX 660。

在再次设置Visual Studio 11之后,我从Github下载了我的最后一个OpenGL项目,并重新构建了整个项目。我从Visual Studio中运行了该应用程序,但它因nvoglv32.dll而崩溃。

Application.exe中0x5D9F74E3(nvoglv32.dll)处出现未处理的异常:0xC0000005:读取位置0x00000000时发生访问冲突。

在旧环境中,应用程序按预期工作。我没有更改任何项目或源代码。唯一的区别是Visual Studio安装的语言,现在是英语,以前是德语。因此,我创建了一个新项目并采用了所有设置,但错误仍然存在。

为了定位崩溃,我注意到所有初始化(窗口、着色器…)都成功了,错误出现在绘图调用glDrawElements()处,该调用引用了我的延迟渲染器的gemoetry过程。

经过一番研究,我发现nvoglv32.dll来自英伟达,是关于一种名为Compatible OpenGL ICD的服务。这是否意味着我的应用程序在兼容模式下运行?这听起来像是一种支持旧应用程序的模式,我希望我的应用程序以常规模式运行!顺便说一下,我为我的视频卡安装了最新的稳定驱动程序。

老实说,我不知道如何修复这次撞车事故。是什么原因造成的?如何解决?

更新:我在Geforce论坛上发现了一篇关于我的问题的帖子。虽然没有回复,但autor可以通过更改两个OpenGL调用的顺序来解决问题。

大家好,

在浏览了我的应用程序源代码几个小时后,我发现调用函数。。。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)
glBindVertexArray(#)

按此顺序会导致nvoglv64.dll中的崩溃。将这些呼叫的顺序改为…

glBindVertexArray(#)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)

防止了崩溃,并且表现良好。

干杯,Robert Graf

由于我不使用顶点数组,我无法简单地进行此修复,但可能存在类似的问题。我将报告我的进展。

更新:我完全不知道如何解决我的问题。我尝试了不同的视频驱动程序版本,但没有区别。我使用最少的着色器和简单的正向渲染完全重写了渲染器。但崩溃门槛发生在第一次抽签时。

为了找到崩溃的位置,我注意到所有初始化(窗口、着色器…)都成功了,错误在绘制调用glDrawElements()处。

很可能你一直在代码中进行越界访问,但AMD Radeon Catalyst驱动程序确实保留了更多的地址空间,或者提前捕获了它们。现在您的NVidia GeForce驱动程序没有了。

您传递给glDrawElements的数字太大,count元素无法绘制,或者您的索引缓冲区包含索引超出顶点数组范围的值。如果是后者,那么您可能使用客户端顶点数组,因为VBO通常会捕获越界访问;而且这些不会使客户端程序崩溃,只会呈现垃圾。

最后我想出了一个解决方案来修复崩溃。

我用来创建窗口的SFML框架提供了一个重置OpenGL上下文状态的功能。我在创建窗口后立即将其命名。

尽管我无法解释原因,但删除该函数调用解决了崩溃问题。也许是因为GLEW或其他什么还没有初始化。

sf::RenderWindow window;
window.create(VideoMode(1024, 768), "Window Title");
window.resetGLStates(); // removing this line fixed the crash
window.setVerticalSyncEnabled(true);

相关内容

  • 没有找到相关文章

最新更新