我一直在尝试使用OpenGL 3.2 +。
我可以成功地渲染一条线到屏幕,或者一个由两个三角形组成的正方形......
我认为我正在使用VAO和VBO,但不知何故我不能同时使用它们......我遇到了奇怪的渲染。
显然,我编码错了......但是当你在不同阵列中定义多个对象时,你应该如何使用VAO和VBO?
我的代码太长了,无法发布到此处,因此我已将一个副本链接到Pastebin > Here <
答案 0 :(得分:4)
如果要显示多个对象,每个对象都在自己的缓冲区数组中,则每个缓冲区都需要自己的顶点数组对象句柄:
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
这是我要显示的第二个对象(甜甜圈),它对上面的鱼有类似的调用:
// -----------
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是( ^()&amp;)(&amp; Here这是一套非常好的教程:http://www.opengl-tutorial.org < / p>