glBindBuffer: имя буфера не относится к объекту буфера, сгенерированному OpenGL - PullRequest
1 голос
/ 26 января 2020

После переключения с SFML на GLFW для управления окнами попытка привязать мой vbo приводит к ошибке OpenGL GL_INVALID_OPERATION (1282) с подробным описанием «Имя буфера не относится к объекту буфера, сгенерированному OpenGL».

I вручную проверил мой 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);

1 Ответ

3 голосов
/ 26 января 2020

В профиле ядра Контекст OpenGL значение (имя) объекта буфера должно быть сгенерировано (зарезервировано) с помощью 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 и не указан.

...