即使 GLEW 已正确初始化,绘制调用也会发生读取访问冲突

Read access violation on draw calls even though GLEW is initialized properly

我正在使用 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);

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 错误。