2

https://learnopengl.com/でOpenGL を学習しています。そのサイトと、この問題を解決しようとしている間のインターネットでの私の調査から、頂点配列オブジェクトは でバインドできるため、便利であることがわかりましたglBindVertexArray

  1. 関連する属性が設定されます。
  2. GL_ARRAY_BUFFER にバインドされたバッファは自動的にバインドされます。
  3. 関連する GL_ELEMENT_ARRAY_BUFFER も自動的にバインドされます。

したがって、次のセットアップ コードは、頂点配列オブジェクトがバインドされると自動的にバインドされる独自の配列バッファーを持つ 2 つの頂点配列オブジェクトをセットアップすることを期待します。これは基本的に同じコードの 2 つのコピーであることに注意してください。また、これは C によく似た Zig のコード スニペットです。

{
    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);
}

glBindBufferafterを明示的に呼び出すとglBindVertexArray、関数は正常に機能しますが、削除するとGL_INVALID_OPERATION in glBufferData(no buffer bound). glBindVertexArrayただし、呼び出しが適切なバッファーをバインドすることを期待しています。

ヘルプ!

4

0 に答える 0