Когда у вас есть несколько объектов для отображения, каждый в своем собственном массиве буфера, каждый буфер нужен свой массив вершин дескриптор объекта:
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 ...). Обратите внимание на 2-й Парме к 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
могли бы вы предоставить скриншот? – bwroga
«Мой код слишком длинный, чтобы публиковать здесь» ... затем [сократите его] (http://sscce.org/). – genpfault
Кроме того, ваши шейдеры - MIA. – genpfault