visual-c++ - 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

标签 visual-c++ opengl crash deferred-rendering

几天前,由于一些硬件更改,我设置了计算机并安装了 Windows 8 的新副本。其中,我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660。

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

Unhandled exception at 0x5D9F74E3 (nvoglv32.dll) in Application.exe: 0xC0000005: Access violation reading location 0x00000000.

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

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

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

说实话,我不知道如何解决此崩溃。什么可能导致它以及如何解决它?

更新:我找到了关于我的问题的 post on Geforce Forums。虽然没有回复,但是作者可以通过改变两个OpenGL调用的顺序来解决这个问题。

Hi all,

After poking around with my application source code for a few hours, I found that calling the functions...

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)
glBindVertexArray(#)

...in that order causes the crash in nvoglv64.dll. Reversing the order of these calls to...

glBindVertexArray(#)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)

...prevents the crash and appears to be well-behaved.

Cheers, Robert Graf

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

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

最佳答案

In order to locate the crash, I noticed that all initialization (window, shaders, ...) succeeded and the error is at the draw call glDrawElements().

很可能您的代码中一直存在越界访问,但 AMD Radeon Catalyst 驱动程序确实保留了更多地址空间,或者事先捕获了它们。而现在您的 NVidia GeForce 驱动程序则不再需要。

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

关于visual-c++ - 新显卡上的 nvoglv32.dll 中的绘制调用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041120/

相关文章:

c++ - wstring 的 isupper 和 islower

c++ - 我能以某种方式不写出完整的限定返回类型名称吗?

c++ - 包含守卫的问题

c - 我的程序崩溃了

visual-c++ - 在 VS 2013 中添加新项目时, "installed"下没有任何内容?

c++ - 使用 Qt5 OpenGL 3.3 替换 glSecondaryColorPointerEXT

opengl - 阴影贴图 - 将 View 空间位置转换为阴影贴图空间

c++ - 如何在 OpenGL 中围绕文本绘制边框?

xml - 为什么这个基于XML布局的Android应用程序崩溃?

使用简单的应用程序在 adb 上 android 进程崩溃,不知道我做错了什么