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

时间:2015-05-25 17:19:10

标签: c++ opengl attributes shared vbo

我知道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);

1 个答案:

答案 0 :(得分:1)

顶级示例不会起作用,因为第二个glBufferData调用将覆盖第二个glBufferData调用中的所有缓冲区空间。要正确地执行此操作,您必须正确使用stride和pointer参数,以便数据交错。只有多个VBO可以更容易(也更干净),每个VBO都存储一组单独的数据。