OpenGL绘制多个顶点数组

OpenGL Draw Multiple Vertex Arrays

我想绘制多个顶点数组。这是初始化:

unsigned int va1;
unsigned int vb1;

void init_va1() {
    glGenVertexArrays(1, &va1);
    glBindVertexArray(va1);
    glGenBuffers(1, &vb1);
    glBindBuffer(GL_ARRAY_BUFFER, vb1);
    glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(vec2), nullptr, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(vec2), nullptr);
    glEnableVertexAttribArray(0);
}

unsigned int va2;
unsigned int vb2;

void init_va2() {
    glGenVertexArrays(1, &va2);
    glBindVertexArray(va2);
    glGenBuffers(1, &vb2);
    glBindBuffer(GL_ARRAY_BUFFER, vb2);
    glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(vec2), nullptr, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(vec2), nullptr);
    glEnableVertexAttribArray(0);
}

初始化时:

init_va1();
init_va2();

平局:

glBindVertexArray(va1);
vec2 a1[] = {
    vec2(0.0, 0.0),
    vec2(0.1, 0.0),
    vec2(0.1, 0.1),
    vec2(0.0, 0.1),
};
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(a1), a1);
glUniform3f(polygon_color_loc, 0, 1, 0);
glDrawArrays(GL_LINE_LOOP, 0, 4);

glBindVertexArray(va2);
vec2 a2[] = {
    vec2(0.0, 0.0),
    vec2(-0.1, 0.0),
    vec2(-0.1, -0.1),
    vec2(0.0, -0.1),
};
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(a2), a2);
glUniform3f(polygon_color_loc, 1, 0, 0);
glDrawArrays(GL_LINE_LOOP, 0, 4);

无论我最后初始化哪个顶点数组都会被正确绘制,而另一个不会被绘制。例如,如果我调用 init_va1(),然后调用 init_va2(),将显示使用 va2 的绘图,而不会显示使用 va1 的绘图。如果我重新排序调用,则会显示使用 va1 的绘图,而不会显示使用 va2 的绘图。如何绘制两个顶点数组?

glBufferSubData 更改当前绑定到指定目标的缓冲区的数据。当前 ARRAY_BUFFER 是全球状态。当你想更新缓冲区的数据存储时,你需要绑定正确的缓冲区对象:

glBindBuffer(GL_ARRAY_BUFFER, vb1);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(a1), a1);

glBindVertexArray(va1);
glDrawArrays(GL_LINE_LOOP, 0, 4);
glBindBuffer(GL_ARRAY_BUFFER, vb2);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(a2), a2);

glBindVertexArray(va2);
glDrawArrays(GL_LINE_LOOP, 0, 4);

对比ARRAY_BUFFERIndex buffers (ELEMENT_ARRAY_BUFFER) is stated in the Vertex Array Object。如果要更改索引缓冲区的内容,也可以只绑定声明索引缓冲区的 VAO。