2013-10-02 2 views
3

Я экспериментировал с OpenGL 3.2+.Рисунок OpenGL Lines & Squares в 3.2 с использованием VAO & VBO's

Я могу успешно оказывать либо линию на экране, или квадрат, состоящий из двух треугольников ...

Я думаю, что я правильно используя VAO и ВБО, все же как-то я не могу разрывая их обоих ... Я испытываю странные проявления.

Очевидно, что я закодировал это неправильно ... но как вы должны использовать VAO и VBO при разрыве нескольких объектов, определенных в разных массивах?

Мой код слишком долго, чтобы разместить здесь, так что я связан копию на Pastebin > Here <

+0

могли бы вы предоставить скриншот? – bwroga

+3

«Мой код слишком длинный, чтобы публиковать здесь» ... затем [сократите его] (http://sscce.org/). – genpfault

+0

Кроме того, ваши шейдеры - MIA. – genpfault

ответ

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); 

выше имеет дело только с т он сначала такой буферный массив, рыба. Каждый последующий объект, который вы хотите отобразить, хочет получить аналогичный набор вызовов 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

+0

Спасибо, что нашли время, чтобы объяснить и показать пример. – Reanimation

Смежные вопросы