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

维克多·德鲁因

从SFML切换到GLFW进行窗口管理后,尝试绑定我的vbo会导致OpenGL错误GL_INVALID_OPERATION(1282),详细信息为“缓冲区名称未引用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);
拉比德76

在核心配置文件OpenGL Context中,缓冲区对象(名称)值必须由生成(保留)glGenBuffers在兼容性配置文件上下文中,这不是必需的。

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

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

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

使用glGenBuffers来解决这个问题:

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

注意,您未指定配置文件类型(glfwWindowHint(GLFW_OPENGL_PROFILE, ...)),默认情况下GLFW_OPENGL_ANY_PROFILE,未指定配置文件类型

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章