3

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

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

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

显然,我的编码是错误的……但是在渲染不同数组中定义的多个对象时,你应该如何使用 VAO 和 VBO?

我的代码太长了,不能在这里发布,所以我在 Pastebin > 这里 <

4

1 回答 1

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

这是我要显示的第二个对象(甜甜圈),它对上面的 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

于 2013-10-03T01:13:41.037 回答