即使GLEW已正确初始化,但在绘图调用上发生读取访问冲突

时间:2018-06-22 20:38:48

标签: c++ opengl runtime-error glfw glew

我正在使用GLEW和GLFW,并且反复出现此错误:

Exception thrown at 0x0819FF06 in GLTest.exe: 0xC0000005: Access violation reading location 0x00000000.

我很确定我已经正确初始化了GLEW(当大多数人看到此错误时,这似乎是错的。)

bool Game_Window::CreateWindow()
{
    if (glfwInit() != true)
        return false;
    glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    m_window = glfwCreateWindow(m_width, m_height, m_title, NULL, NULL);
    glfwMakeContextCurrent(m_window);

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
        return false;

    glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
    std::cout << glGetString(GL_VERSION) << std::endl;

     return true;
}

这是我用来绘制的代码:

#include "Game_Window.h"
#include "Shader.h"

float verticies[] = 
{
    -0.5f,-0.5f,0.0f,
    0.5f,-0.5f,0.0f,
    0.0f,0.5f,0.0f,
};
GLuint indecies[] =
{
    0,1,2,
};

int main()
{
    Game_Window window("Window", 1600, 900);
    if (window.CreateWindow())
    {
        Shader shader("basic.vert", "basic.frag");
        shader.CreateShader();
        shader.Use();

        GLuint VAO, VBO, EBO;
        glGenVertexArrays(1, &VAO);
        glBindVertexArray(VAO);

        glGenBuffers(1, &VBO);
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(VBO, sizeof(verticies), verticies, GL_STATIC_DRAW);

        glGenBuffers(1, &EBO);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indecies), indecies, GL_STATIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 
 (void*)0);
        glEnableVertexAttribArray(0);

        while (window.ShouldStayOpen())
        {           
            window.Update();
            window.clear();
            glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
            window.swapBuffers();
        }
    }
    return 0;
}

这个错误让我很困惑,因为它似乎也发生在随机的glfw函数上(但我不确定,因为我无法使其始终如一地发生)。在添加之前,我不会收到任何错误:

  glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);

1 个答案:

答案 0 :(得分:2)

glBufferData的第一个参数必须是 target 枚举常量(例如GL_ARRAY_BUFFER),而不是命名的缓冲区对象。

像这样更改代码以解决该问题:

glBufferData(
    GL_ARRAY_BUFFER, // GL_ARRAY_BUFFER instead of VBO
    sizeof(verticies), verticies, GL_STATIC_DRAW);

请注意,如果要检查OpenGL错误(glGetError),则在这种情况下会出现GL_INVALID_ENUM错误。