未处理的异常,glGenVertexArrays调用上的访问冲突

时间:2015-04-15 18:36:25

标签: opengl visual-studio-2013 glfw glew unhandled-exception

我目前在Windows 8上遇到一些OpenGL开发问题。我正在为一个在Linux中运行的项目设置OpenGL。

我们在这个项目中同时使用glfw和glew。

我的实际问题是glGenVertexArrays为null,当它被调用时崩溃并且我得到访问冲突。 glGenVertexArrays不是第一个使用glew调用的gl调用。

我在本教程后使用win32库将glew和glfw链接到visual studio项目:http://www.41post.com/5178/programming/opengl-configuring-glfw-and-glew-in-visual-cplusplus-express

以下代码是初始化代码:

glfwSetErrorCallback(error_callback);

    if (!glfwInit())
    {
        LOG_FATAL << "Failed to init glfw context";
        exit(EXIT_FAILURE);
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    m_window = glfwCreateWindow(1240, 480, "Rubix", NULL, NULL);

    if (!m_window)
    {
        glfwTerminate();
        LOG_FATAL << "Failed to create glfw window";
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(m_window);

    #ifdef WIN32
    //glewExperimental = GL_TRUE;
    GLenum glewinit = glewInit();

    if (glewinit != GLEW_OK)
    {
        std::cout << "Glew not okay! " << glewinit;
        exit(EXIT_FAILURE);
    }
    #endif

    glfwSwapInterval(1);
    glfwSetKeyCallback(m_window, key_callback);

    LOG_INFO << "glfw OpenGL context ready";

    initGL();

调用以下代码以显示多维数据集:

float points[] = {
        0.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 1.0f, 1.0f,
        1.0f, 1.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f, 1.0f
    };

    float normals[] = {
        0.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 1.0f, 1.0f,
        1.0f, 1.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f, 1.0f
    };

    unsigned short index_array[] = {
        0, 3, 2,
        0, 2, 1,
        0, 1, 5,
        0, 5, 4,
        1, 2, 6, 
        1, 6, 5,
        2, 3, 7,
        2, 7, 6,
        3, 0, 4,
        3, 4, 7,
        4, 5, 6,
        4, 6, 7,
    };

    GLuint points_vbo;
    glGenBuffers (1, &points_vbo);
    glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
    glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), points, GL_STATIC_DRAW);

    GLuint normals_vbo;
    glGenBuffers (1, &normals_vbo);
    glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
    glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), normals, GL_STATIC_DRAW);

    GLuint index_buffer_object;
    glGenBuffers (1, &index_buffer_object);
    glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
    glBufferData (GL_ELEMENT_ARRAY_BUFFER, 48 * sizeof (unsigned short), index_array, GL_STATIC_DRAW);

    glGenVertexArrays (1, &m_vao);
    glBindVertexArray (m_vao);
    glEnableVertexAttribArray (0);
    glEnableVertexAttribArray (1);

    glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
    glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
    glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);

    glBindVertexArray(0);

    // Creating program

    Program program;

    program.emplace_back("pos.vert", GL_VERTEX_SHADER);
    program.emplace_back("smooth.frag", GL_FRAGMENT_SHADER);

    program.link();

    program.clearShaders();

    m_program = program.getProgram();

我确实尝试过glewExperimental = GL_TRUE;这样代码就会运行,但它不会显示任何内容。

我使用的gpu是一个nvidia GT 730M,它确实支持高达4.2的opengl。

我还运行了glewinfo.exe,它说glGenVertexArrays应该没问题。 另外我注意到当我打开位于Windows工具包下的gl文件夹中的glcorearb.h(使用visual studio 2013)时,opengl中的大多数版本都是灰色的,我认为问题可能与此有关。

2 个答案:

答案 0 :(得分:0)

如果存在不充分的OpenGL环境,您的代码不会检查是否满足所需的运行时先决条件,因此它不会遇到此情况。很可能OpenGL驱动程序安装不正确,这就是GLEW无法初始化所需函数指针的原因。

请注意,Microsoft正在破坏OpenGL并剥离通过Windows Update或初始Windows安装程序安装的驱动程序中的OpenGL ICD。请仔细检查,您已直接从NVidia网站下载的驱动程序已正确安装。

答案 1 :(得分:0)

好吧,问题是视觉工作室没有使用正确的GPU。为了解决这个问题,我进入了Nvidia控制面板 - &gt;管理3D设置 - &gt;程序设置并添加了我的debug exe和release exe。

之后它没有工作的原因是我忘了尝试将glewExperimental设置为true。

设置完成后我的问题就解决了。