我应该使用相同的 VBO 来传递不同的顶点属性吗?或者我应该使用 2?

Should I use the same VBO for passing different vertex attributes? Or should I use 2?

我知道 glVertexAttribPointer 将使用调用时绑定的 VBO 中的值。但是你能在同一个对象上缓冲两次吗?它会取代里面的东西吗?或者你能清除缓冲区吗?不知道这个做法对不对:

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO); // shared VBO

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);


glBufferData(GL_ARRAY_BUFFER,  sizeof(colours),  colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);

glBindBuffer(GL_ARRAY_VERTEX, 0);
glBindVertexArray(0);

或者我是否应该使用 2 个 VBO 来缓冲数据。如果对同一个绑定顶点数组对象调用 glBufferData 函数两次,会发生什么情况?这是我想到的另一种方式:

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO1); // VBO for vertices

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);

glBindBuffer(GL_ARRAY_BUFFER, VBO2); // VBO for colours

glBufferData(GL_ARRAY_BUFFER,  sizeof(colours),  colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

上面的示例将不起作用,因为第二个 glBufferData 调用将覆盖第二个中的所有缓冲区 space。要正确地做到这一点,您必须正确地使用 stride 和 pointer 参数,以便数据交错。拥有多个 VBO 更容易(也更干净),每个 VBO 存储一组单独的数据。