使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常

Getting access violation exception in Visual Studio Community with glfw3 glew and opengl

我遇到这个问题已经有一段时间了,看在我的份上,我找不到解决办法。

我想渲染一个简单的三角形。但是我在编译程序时一直在 visual studio 中得到这个输出。

注意> 我不认为这不是链接问题而是其他问题。我无数次检查了我的链接器,一切都在那里!

LINK: 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.

你得到的错误告诉你你正试图执行一个指向 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 不是 return 整数而是 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