GLFW3 和 GLEW32:0xC0000005:访问冲突执行位置

GLFW3 and GLEW32: 0xC0000005: Access violation executing location

我已经安装了所有库,例如 glfw and glew

当我 运行 以下代码时,我从行 glGenVertexArrays(1, &VertexArrayID); 中得到一个错误,抱怨 Access violation。我知道这个错误是由 NULL 指针引起的,但我的 GLuint 不应该。

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <gl/GL.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f,-1.0f,-1.0f, // triangle 1 : begin
    -1.0f,-1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f, // triangle 1 : end
    1.0f, 1.0f,-1.0f, // triangle 2 : begin
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f, // triangle 2 : end
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f
    };
static const GLfloat g_color_buffer_data[] = {
    0.583f,  0.771f,  0.014f,
    0.609f,  0.115f,  0.436f,
    0.327f,  0.483f,  0.844f,
    0.822f,  0.569f,  0.201f,
    0.435f,  0.602f,  0.223f,
    0.310f,  0.747f,  0.185f,
    0.597f,  0.770f,  0.761f,
    0.559f,  0.436f,  0.730f,
    0.359f,  0.583f,  0.152f,
    0.483f,  0.596f,  0.789f,
    0.559f,  0.861f,  0.639f,
    0.195f,  0.548f,  0.859f,
    0.014f,  0.184f,  0.576f,
    0.771f,  0.328f,  0.970f,
    0.406f,  0.615f,  0.116f,
    0.676f,  0.977f,  0.133f,
    0.971f,  0.572f,  0.833f,
    0.140f,  0.616f,  0.489f,
    0.997f,  0.513f,  0.064f,
    0.945f,  0.719f,  0.592f,
    0.543f,  0.021f,  0.978f,
    0.279f,  0.317f,  0.505f,
    0.167f,  0.620f,  0.077f,
    0.347f,  0.857f,  0.137f,
    0.055f,  0.953f,  0.042f,
    0.714f,  0.505f,  0.345f,
    0.783f,  0.290f,  0.734f,
    0.722f,  0.645f,  0.174f,
    0.302f,  0.455f,  0.848f,
    0.225f,  0.587f,  0.040f,
    0.517f,  0.713f,  0.338f,
    0.053f,  0.959f,  0.120f,
    0.393f,  0.621f,  0.362f,
    0.673f,  0.211f,  0.457f,
    0.820f,  0.883f,  0.371f,
    0.982f,  0.099f,  0.879f
};


GLFWwindow* GLFWInit()
{
    if (!glfwInit())
    {
        fprintf(stderr, "Failed to initialize GLFW\n");
    }
    glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want OpenGL 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // We don't want the old OpenGL
    GLFWwindow* window; // (In the accompanying source code, this variable is global for simplicity)
    window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
    glewExperimental = GL_TRUE;
    // Initialize GLEW to setup the OpenGL Function pointers
    glewInit();
    if (window == NULL) {
        printf("Failed to create window context.\n");
    }
    glfwMakeContextCurrent(window); // Initialize GLEW
    return window;
}


int main()
{
    GLFWwindow* window = GLFWInit();

    //vertex shader ID array setup:
    
    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);
    // some other code

    while (!glfwWindowShouldClose(window)) {
        // wipe the drawing surface clear
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        // update other events like input handling 
        glDrawArrays(GL_TRIANGLES, 0, 12 * 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
        glfwPollEvents();
        // put the stuff we've been drawing onto the display
        glfwSwapBuffers(window);
        
    }
    glfwTerminate();
    return 0;
}

我查看了其他类似的 questions,并将以下内容添加到我的代码中但无济于事。

glewExperimental = GL_TRUE;
glewInit();

这是我机器的规格(如果有帮助的话):

这一直是一个简单的错误 - 在我的 GLFWInit 函数中,在实际创建 window 之前调用了以下行。

glewExperimental = GL_TRUE;
glewInit();

将这些行放在 return window 之前但在 glfwMakeContextCurrent(window) 之后可以使它现在完美运行。感谢您的帮助。

window创建、上下文激活和扩展加载的顺序错误。

在您的代码中,您首先尝试创建 window,然后在不检查是否成功的情况下尝试加载扩展(首先没有激活上下文),然后执行上下文激活。 *除了 window 的创作,你的一切都是倒过来的。

您的代码崩溃了,因为您试图加载 OpenGL 扩展,而上下文在当前线程上没有处于活动状态。没有活动上下文,您将无法加载扩展。 在 Microsoft Windows 上,加载扩展的地址特定于每个上下文,因此严格来说 Windows 你必须为你创建的每个单独的上下文加载扩展!

但是,如果没有活动的上下文,扩展加载就会失败,函数的指针将保持未初始化状态或设置为空指针。因此调用它们时崩溃。

正确的顺序是

// Create window and check for failure
GLFWwindow *const window = glfwCreateWindow(
    1024, 768,
    "Tutorial 01",
    NULL, NULL );
if( !window ){
    printf("Failed to create window context.\n");
    return NULL;
}

// activate context on current thread
glfwMakeContextCurrent(window);

// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();