绘制OpenGL线和&使用VAO& amp;的3.2中的正方形VBO的

时间:2013-10-02 11:35:13

标签: c++ opengl

我一直在尝试使用OpenGL 3.2 +。

我可以成功地渲染一条线到屏幕,或者一个由两个三角形组成的正方形......

我认为我正在使用VAO和VBO,但不知何故我不能同时使用它们......我遇到了奇怪的渲染。

显然,我编码错了......但是当你在不同阵列中定义多个对象时,你应该如何使用VAO和VBO?

我的代码太长了,无法发布到此处,因此我已将一个副本链接到Pastebin > Here <

1 个答案:

答案 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>