[英]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.