簡體   English   中英

使用VAO和VBO在3.2中繪制OpenGL線和正方形

[英]Drawing OpenGL Lines & Squares in 3.2 using VAO & VBO's

我一直在試驗OpenGL 3.2+。

我可以成功地渲染一條線到屏幕,或者一個由兩個三角形組成的正方形......

我認為我正在使用VAO和VBO,但不知怎的,我不能同時使用它們......我遇到了奇怪的渲染。

顯然,我把它編碼錯了......但是當你渲染不同數組中定義的多個對象時,你應該如何使用VAO和VBO呢?

我的代碼在這里發布的時間太長了,所以我在Pastebin > Here <上鏈接了一個副本

如果要顯示多個對象,每個對象都在自己的緩沖區數組中,則每個緩沖區都需要自己的頂點數組對象句柄:

int curr_num_object = 0;

static const int vertex_array_object_fish = curr_num_object++;
static const int vertex_array_object_shark = curr_num_object++; 
static const int vertex_array_object_doughnut = curr_num_object++;


GLuint array_vertex_array_object[curr_num_object]; // one for each drawn object

glGenVertexArrays(curr_num_object, &array_vertex_array_object[0]);

然后為您綁定的每個緩沖區數組,然后將其數據加載到GPU:

    // -----------------  fish

glBindVertexArray(array_vertex_array_object[vertex_array_object_fish]); // fish VAO

GLuint vertex_buffer_fish;
glGenBuffers(1, & vertex_buffer_fish);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_fish);
glBufferData(GL_ARRAY_BUFFER, audio_model->get_sizeof_fish_array(), audio_model->get_address_fish_array(), GL_DYNAMIC_DRAW);

glVertexAttribPointer(
    0,                  // attribute. No particular reason for 0, but must match the layout in the shader.
    2,                  // size
    GL_FLOAT,           // type
    GL_FALSE,           // normalized?
    0,                  // stride
    (void*)0            // array buffer offset
);
glEnableVertexAttribArray(0);

上面只涉及第一個這樣的緩沖陣列,魚。 您希望顯示的每個后續對象都需要一組類似的OpenGL調用。 在窗口事件循環之外調用上面一次(glfw,glut ...)。 請注意第二個參與glVertexAttribPointer的2D數組...這是它的標題條目:

float molecules_location_fish[max_fish][num_dimensions_2D_grid]; //  X & Y per fish

這是我要顯示的第二個對象(甜甜圈),它對上面的魚有類似的調用:

// -----------

glBindVertexArray(array_vertex_array_object[vertex_array_object_doughnut]); // doughnut VAO
GLuint vertex_buffer_doughnut_box;
glGenBuffers(1, & vertex_buffer_doughnut_box);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_doughnut_box);
glBufferData(GL_ARRAY_BUFFER, audio_model->get_sizeof_doughnut_box_array(), audio_model->get_address_doughnut_box_array(), GL_DYNAMIC_DRAW);

glVertexAttribPointer(
    0,                  // attribute. No particular reason for 0, but must match the layout in the shader.
    3,                  // size
    GL_FLOAT,           // type
    GL_FALSE,           // normalized?
    0,                  // stride
    (void*)0            // array buffer offset
);
glEnableVertexAttribArray(0);

// -----------

現在在你的窗口事件循環中,也許你也可以調用更新對象數據(行,三角形......),你可以為每個對象顯示以下OpenGL調用:

    // ---------

    glBindVertexArray(array_vertex_array_object[vertex_array_object_fish]);

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_fish);

    glBufferData(GL_ARRAY_BUFFER, audio_model->get_sizeof_fish_array(), audio_model->get_address_fish_array(), GL_DYNAMIC_DRAW);
    glDrawArrays(GL_POINTS, 0, audio_model->get_curr_num_fish()); // 12*3 indices starting at 0 -> 12 triangles

為了完整起見,這里是您的事件循環中的甜甜圈調用:

    glBindVertexArray(array_vertex_array_object[vertex_array_object_doughnut]);

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_doughnut_box);
    glBufferData(GL_ARRAY_BUFFER,audio_model->get_sizeof_doughnut_box_array(),audio_model->get_address_doughnut_box_array(),GL_DYNAMIC_DRAW);

    glDrawArrays(GL_TRIANGLES, 0, audio_model->get_curr_num_doughnut_boxes());

在我的魚中注意我將其顯示為2D作為點,而甜甜圈是3D並顯示為一組三角形(未編入索引)

讓我們知道你是如何進行的 - 這個初學速度學習OpenGL是( ^() &)(&這是一套非常好的教程: http//www.opengl-tutorial.org

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM