使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常
Posted
技术标签:
【中文标题】使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常【英文标题】:Getting access violation exception in Visual Studio Community with glfw3 glew and opengl 【发布时间】:2019-01-24 15:16:52 【问题描述】:我遇到这个问题已经有一段时间了,但我无法找到解决方案。
我想渲染一个简单的三角形。但是我在编译程序时一直在 Visual Studio 中得到这个输出。
注意> 我不相信这不是链接问题,而是其他问题。我无数次检查了我的链接器,一切都在那里!
链接:https://pastebin.com/xeTDd0Qu
主要
static const GLfloat g_vertex_buffer_data[] =
100.0f, 100.0f, 0.0f,
150.0f, 100.0f, 0.0f,
100.0f, 150.0f, 0.0f,
;
GLFWwindow* window;
window = initWindow(640, 480, "Title");
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
while (!glfwWindowShouldClose(window))
glViewport(0, 0, 640, 480);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glFlush();
glfwSwapBuffers(window);
glfwPollEvents();
glfwTerminate();
return 0;
initWindow()
GLFWwindow* initWindow(int a_width, int a_height, const char* title)
glewExperimental = GL_TRUE;
int err = glewInit();
if (!err)
exit(-1);
if (!glfwInit())
printf("glfwInit() failed!");
return nullptr;
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
if (!window)
glfwTerminate();
return nullptr;
return window;
谢谢!
编辑:我得到的异常消息: 在 ConvexHullVisualiser.exe 中的 0x00000000 处引发异常:0xC0000005:访问冲突执行位置 0x00000000。
【问题讨论】:
你的意思是编译的时候?是否有更多有关错误的详细信息?例如它去哪儿了? @doctorlove 运行程序时。它弹出一个窗口并说它在 glGenBuffers(1, &VertexArray) 处被违反 您应该逐行执行代码。然后在这里报告错误发生在哪一行。还要说明确切的错误消息。如果它声明“访问冲突读取......”或“访问冲突写入......”或“访问冲突正在执行......”,则会产生巨大的差异。 我猜问题是你在创建窗口之前初始化了glew。 @BDL 哦,我忘了添加实际错误...我会编辑,请稍等 【参考方案1】:你得到的错误告诉你你正在尝试执行一个指向 NULL 的函数指针。大多数 OpenGL 函数是(在 Windows 上)函数指针,并在运行时加载。总的来说,这意味着您正在尝试执行尚未加载的 OpenGL 函数。
这很可能是因为只有存在有效的 OpenGL 上下文时才能成功初始化 GLEW。由于上下文是由glfwCreateWindow
创建的,因此必须在此行之后调用glewInit
。
您还缺少对 glfwMakeContextCurrent
的调用以绑定 OpenGL 上下文
到活动线程。
if (!glfwInit())
printf("glfwInit() failed!");
return nullptr;
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
if (!window)
glfwTerminate();
return nullptr;
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
int err = glewInit();
if (!err)
exit(-1);
请注意,glewInit
不返回 int,而是返回 GLenum
。正确的错误检查应该是这样的:
GLenum err = glewInit();
if (GLEW_OK != err)
/* Problem: glewInit failed, something is seriously wrong. */
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
...
Source: GLEW Documentation
【讨论】:
它现在显示错误并显示“错误缺少 GL 版本”编辑:我设法让它工作!原来我忘了做 glfwMakeContextCurrent(window) !但是屏幕上什么也没有显示... 哦是的...我没看到!谢谢! @64humans:我添加它是为了回应您的评论。解决问题了吗? 是的,但我仍然无法渲染任何东西。我刚刚完成了着色器编译,但没有渲染任何东西我什至尝试渲染一个简单的四边形但甚至没有。我可以改变 glClear() 的颜色以上是关于使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章