glBindBuffer : 缓冲区名称不引用 OpenGL 生成的缓冲区对象

glBindBuffer : Buffer name does not refer to an buffer object generated by OpenGL

从 SFML 切换到 GLFW 以进行 window 管理后,尝试绑定我的 vbo 导致 OpenGL 错误 GL_INVALID_OPERATION (1282),详细信息 "Buffer name does not refer to an buffer object generated by OpenGL"。

我手动检查了我的 vbo,它似乎被赋予了正确的值。

这是我可以使用 glew-2.1.0 和 glfw-3.3.0 生成的工作示例。


    if (!glfwInit())
    {
        return EXIT_FAILURE;
    }
    std::cout << glfwGetVersionString() << std::endl;
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
    auto window = glfwCreateWindow(g_width, g_height, "An Other Engine", nullptr, nullptr);
    if (window == nullptr)
    {
        return EXIT_FAILURE;
    }
    glfwMakeContextCurrent(window);
    if (glewInit() != GLEW_OK)
    {
        return EXIT_FAILURE;
    }
    GLint flags;
    glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
    if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
    {
        glEnable(GL_DEBUG_OUTPUT);
        glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
        glDebugMessageCallback(glDebugOutput, nullptr);
        glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
    }

    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    GLuint vbo;
    glGenVertexArrays(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);

在核心配置文件中 OpenGL Context, the buffer object (name) value has to be generated (reserved) by glGenBuffers。这在兼容性配置文件上下文中不是必需的。

您错误地尝试通过 glGenVertexArrays 而不是 glGenBuffers 生成缓冲区名称。

glGenVertexArrays(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

当您尝试通过 glBindBuffer 生成缓冲区对象时会导致 INVALID_OPERATION 错误。

使用glGenBuffers解决问题:

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

请注意,您没有指定配置文件类型 (glfwWindowHint(GLFW_OPENGL_PROFILE, ...)),默认配置文件类型是 GLFW_OPENGL_ANY_PROFILE 而未指定。