OpenGL Vertex Array Object не может связать Vertex Buffer

Я изучаю OpenGL через https://learnopengl.com/. Из этого сайта и из моих исследований в Интернете при попытке решить эту проблему я узнал, что объекты массива вершин полезны, потому что вы можете связать их сglBindVertexArray, а также

  1. Будут установлены все связанные атрибуты.
  2. Буфер, привязанный к GL_ARRAY_BUFFER, будет автоматически привязан.
  3. Связанный GL_ELEMENT_ARRAY_BUFFER также будет автоматически привязан.

Таким образом, я ожидал бы, что следующий установочный код настроит два объекта массива вершин, каждый из которых имеет свои собственные буферы массива, которые будут автоматически связаны при привязке объекта массива вершин. Обратите внимание, что это, по сути, две копии одного и того же кода. Кроме того, это фрагмент кода Zig, который очень похож на C.

{
    glGenBuffers(1, &rectangle_vertex_buffer_object);

    glGenBuffers(1, &rectangle_element_buffer_object);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rectangle_element_buffer_object);
    var fill_indices = [_]u32{ 0, 1, 2, 1, 2, 3 };
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, fill_indices.len * @sizeOf(u32), &fill_indices, GL_STATIC_DRAW);

    glGenVertexArrays(1, &rectangle_vertex_array_object);
    glBindVertexArray(rectangle_vertex_array_object);
    glBindBuffer(GL_ARRAY_BUFFER, rectangle_vertex_buffer_object);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rectangle_element_buffer_object);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * @sizeOf(f32), @intToPtr(*allowzero c_void, 0));
    glEnableVertexAttribArray(0);
    glBindVertexArray(0);
}

{
    glGenBuffers(1, &glyph_vertex_buffer_object);

    glGenBuffers(1, &glyph_element_buffer_object);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glyph_element_buffer_object);
    var fill_indices = [_]u32{ 0, 1, 2, 1, 2, 3 };
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, fill_indices.len * @sizeOf(u32), &fill_indices, GL_STATIC_DRAW);

    glGenVertexArrays(1, &glyph_vertex_array_object);
    glBindVertexArray(glyph_vertex_array_object);
    glBindBuffer(GL_ARRAY_BUFFER, glyph_vertex_buffer_object);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glyph_element_buffer_object);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * @sizeOf(f32), @intToPtr(*allowzero c_void, 0));
    glEnableVertexAttribArray(0);
    glBindVertexArray(0);
}

У меня есть функция рисования прямоугольников:

pub fn fillRectangle(x: f32, y: f32, width: f32, height: f32) void {
    var flip_y = -y;
    glBindVertexArray(rectangle_vertex_array_object);
    // glBindBuffer(GL_ARRAY_BUFFER, rectangle_vertex_buffer_object); -- Stuff works if I uncomment this line.
    const vertices = [_]f32{
        x,         flip_y,
        x + width, flip_y,
        x,         flip_y - height,
        x + width, flip_y - height,
    };
    glBufferData(GL_ARRAY_BUFFER, vertices.len * @sizeOf(f32), &vertices, GL_STATIC_DRAW);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, @intToPtr(*allowzero c_void, 0));
    glBindVertexArray(0);
}

Если я явно позвоню glBindBuffer после glBindVertexArray, тогда функция работает нормально, но если я удалю ее, то получу GL_INVALID_OPERATION in glBufferData(no buffer bound). Однако я ожидалglBindVertexArray вызов для привязки соответствующего буфера.

Помогите!

0 ответов

Другие вопросы по тегам