我一直在尝试使用 OpenGL 3.2+。
我可以成功地将一条线渲染到屏幕上,或者一个由两个三角形组成的正方形......
我认为我正确使用了 VAO 和 VBO,但不知何故我无法同时渲染它们……我遇到了奇怪的渲染。
显然,我的编码是错误的……但是在渲染不同数组中定义的多个对象时,你应该如何使用 VAO 和 VBO?
我的代码太长了,不能在这里发布,所以我在 Pastebin > 这里 <
当您有多个对象要显示时,每个对象都在自己的缓冲区数组中,每个缓冲区都需要自己的顶点数组对象句柄:
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);
上面只处理第一个这样的缓冲区数组,fish。您希望显示的每个后续对象都需要一组类似的 OpenGL 调用。以上在您的窗口事件循环(glfw,glut ...)之外调用一次。请注意,在 glVertexAttribPointer 的第二个参数中,它是一个 2D 数组......这是它的标题条目:
float molecules_location_fish[max_fish][num_dimensions_2D_grid]; // X & Y per fish
这是我要显示的第二个对象(甜甜圈),它对上面的 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