使用 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 社区中获取访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 函数未定义 OSX

glGenVertexArrays 上的 OpenGL C++ glfw 3 glew 错误 1282

OpenGL配置GLFW与GLEW的问题

GLEW 未在 MSYS2 上定位 OpenGL 函数

使用glew和glad 新建窗口

GLFW3 中是不是有 glutDisplayFunc 等价物?