VS+glfw编写openGL例子程序报错 0x59789958 (igd10iumd32.dll) 处有未经处理的异常解决思路

探讨了在Win10环境下使用VS2013和glfw版本3.2.1进行OpenGL程序调试时,遇到的Intel与NVIDIA显卡驱动兼容性问题。详细描述了在不同驱动版本和配置下,OpenGL程序的调试表现,以及调试过程中出现的具体错误。

环境:
Win10 x64
VS 2013
glfw版本3.2.1

情况1

Intel HD Graphics 4000
软件内查到版本:10.18.10.4252
官网名称:15.33.47.5059

nVidia GeForce 625M
版本391.35

结果:
Intel显卡下可以正常调试,打开。
nVidia下调试卡在wglMakeCurrent(NULL,NULL)一句,即便以前编译的程序都无法运行,一样会卡住。

但是游戏都能正常运行。

情况2

卸载nVidia驱动后,Intel表现正常。

情况3

dell驱动官网下载 Video_Driver_D3DCY_WN32_10.18.13.5324_A00.exe 安装。
驱动显示版本为v10.18.13.5324

装完后,

Intel
显示版本和之前一样:10.18.10.4252

nVidia
版本:353.24

结果:
Intel显卡下可以正常调试。
nVidia下调试报错 0x59789958 (igd10iumd32.dll) (1_hello_triangle.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0x77AD2156 时发生访问冲突。

但编译后的程序可以单独用nVidia运行。

结论

调试opgnGL程序高度依赖显卡驱动,nVidia驱动更新最新版后,不知为何卡在glfw里的wglMakeCurrent(NULL,NULL)一句,且之前编译的程序也不能运行。

nVidia驱动回退后,可以运行编译后的程序,但在nVidia下调试时却报错,而且报错内容是显示intel的dll出错,问题十分古怪。

### 可能的原因及解决方案 在调用 `glBindVertexArray` 时引发 `0xC0000005` 访问冲突异常,通常表明程序尝试访问无效的内存地址或上下文未正确初始化。以下是一些可能的原因及其对应的解决方案。 #### 1. **OpenGL 上下文未正确初始化** 如果 OpenGL 上下文未正确初始化,调用 `glBindVertexArray` 将导致访问冲突错误。确保在创建窗口后正确初始化 OpenGL 上下文,并验证上下文是否有效。 ```c if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); return -1; } GLFWwindow* window = glfwCreateWindow(800, 600, "Test Window", NULL, NULL); if (!window) { fprintf(stderr, "Failed to create GLFW window\n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 确保上下文被激活[^1] ``` #### 2. **VAO 扩展未启用** 在某些旧版 OpenGL 实现中,`glBindVertexArray` 是通过扩展提供的。如果扩展未启用,可能会导致访问冲突。可以通过以下代码检查扩展支持: ```c const GLubyte* version = glGetString(GL_VERSION); if (version && strstr((const char*)version, "3.0")) { // 如果支持 OpenGL 3.0 或更高版本,则 VAO 为标准功能 } else { // 否则需要加载扩展函数 PFNGLBINDVERTEXARRAYPROC glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glfwGetProcAddress("glBindVertexArray"); if (!glBindVertexArray) { fprintf(stderr, "VAO extension not supported\n"); return -1; } } ``` #### 3. **VAO 对象未生成或无效** 在绑定 VAO 之前,必须先生成有效的 VAO 对象。如果传递给 `glBindVertexArray` 的 VAO 标识符无效,将导致访问冲突。 ```c GLuint vao; glGenVertexArrays(1, &vao); // 生成 VAO 对象 if (vao == 0) { fprintf(stderr, "Failed to generate VAO\n"); return -1; } glBindVertexArray(vao); // 绑定生成的 VAO 对象[^2] ``` #### 4. **OpenGL 函数指针未正确加载** 如果使用的是动态链接库(例如在 Windows 平台上),必须通过 `glfwGetProcAddress` 加载 OpenGL 函数指针。如果函数指针未正确加载,调用这些函数可能导致访问冲突。 ```c PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glfwGetProcAddress("glGenVertexArrays"); PFNGLBINDVERTEXARRAYPROC glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glfwGetProcAddress("glBindVertexArray"); if (!glGenVertexArrays || !glBindVertexArray) { fprintf(stderr, "Failed to load OpenGL function pointers\n"); return -1; } ``` #### 5. **硬件或驱动问题** 某些显卡驱动可能不完全支持所需的 OpenGL 功能。可以尝试更新显卡驱动程序,或者降低 OpenGL 版本以适应较低的硬件要求。 ### 示例代码 以下是一个完整的示例,展示如何正确生成和绑定 VAO: ```c #include <GLFW/glfw3.h> #include <stdio.h> int main() { if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); return -1; } GLFWwindow* window = glfwCreateWindow(800, 600, "Test Window", NULL, NULL); if (!window) { fprintf(stderr, "Failed to create GLFW window\n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); GLuint vao; glGenVertexArrays(1, &vao); // 生成 VAO 对象 if (vao == 0) { fprintf(stderr, "Failed to generate VAO\n"); return -1; } glBindVertexArray(vao); // 绑定 VAO 对象[^3] while (!glfwWindowShouldClose(window)) { glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0; } ``` ### 注意事项 - 确保所有依赖库均已正确安装,并且路径配置无误。 - 在调试时,可以使用工具(如 `gDEBugger` 或 `RenderDoc`)检查 OpenGL 调用的状态和参数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值