【问题标题】:GLFW3 and GLEW32: 0xC0000005: Access violation executing locationGLFW3 和 GLEW32:0xC0000005:访问冲突执行位置
【发布时间】:2020-11-06 23:59:49
【问题描述】:

我已经安装了所有的库,例如 glfwglew

当我运行以下代码时,我从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();

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

  • 它在 MS Windows 10 上运行。
  • 我的 IDE 是 Visual Studio 2019
  • 所有库均已正确安装。

【问题讨论】:

  • 我会检查glewInit() 的返回值,如果失败,那将解释你的错误。似乎很有可能。
  • 刚刚检查,它返回1。我认为这意味着成功?
  • GLEW_OK 是成功错误代码。刚查了一下,GLEW_OK 为零,所以你有问题。
  • 快速检查后应该不会返回1。这可能意味着它失败了 - 但为什么呢?
  • 嗯,这是一个不同的问题,毫无疑问与您的升级有关。

标签: c++ c opengl glfw glew


【解决方案1】:

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

glewExperimental = GL_TRUE;
glewInit();

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

【讨论】:

    【解决方案2】:

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

    在您的代码中,您首先尝试创建窗口,然后在不检查是否成功的情况下尝试加载扩展(首先没有激活上下文),然后进行上下文激活。 *除了创建窗口之外,你所有的东西都是倒退的。

    您的代码崩溃,因为您尝试加载 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();
    

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多