【发布时间】:2013-02-09 01:42:00
【问题描述】:
几天前,由于一些硬件更改,我设置了我的计算机并安装了一个新的 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() 中,它引用了我的延迟渲染器的几何传递。
经过一番研究,我发现 nvoglv32.dll 来自 Nvidia,是关于一个名为 Compatible OpenGL ICD 的服务。这是否意味着我的应用程序以兼容模式运行?这听起来像是一种支持旧应用程序的模式,我希望我的应用程序以常规模式运行!顺便说一句,我为我的显卡安装了最新的稳定驱动程序。
说实话,我不知道如何解决这个崩溃问题。什么可能导致它以及如何解决它?
更新:我发现了一个关于我的问题的post on Geforce Forums。虽然没有回复,但作者可以通过更改两次 OpenGL 调用的顺序来解决问题。
大家好,
在研究了我的应用程序源代码几个小时后,我发现调用函数...
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #) glBindVertexArray(#)...按此顺序会导致 nvoglv64.dll 崩溃。 将这些调用的顺序颠倒到...
glBindVertexArray(#) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)...防止崩溃,并且表现得很好。
干杯, 罗伯特·格拉夫
由于我不使用顶点数组,我无法简单地进行此修复,但可能存在类似问题。我会报告我的进展。
更新:我完全不知道如何解决我的问题。我尝试了不同的视频驱动程序版本,但没有区别。我使用最少的着色器和简单的前向渲染完全重写了渲染器。但崩溃发生在第一次绘制调用时。
【问题讨论】:
-
我从显示器切换到电视后开始得到这个
标签: visual-c++ opengl crash deferred-rendering