动态打包OpenGL顶点缓冲区对象的数据

时间:2013-10-16 05:55:28

标签: c++ opengl vbo

我试图在OOP中为VBO编写一个包装器,它包含addVertex,addNormal .. addX,flush()和render()函数。首先,我在单独的向量中保存顶点,法线,索引,如:

std::vector<glm::vec4> vertexBuffer;
std::vector<glm::vec4> colorBuffer;
std::vector<glm::vec3> normalBuffer;
std::vector<glm::vec2> texCoordBuffer;
std::vector<unsigned int> indexBuffer;

但是当我在某处读到时,为每个人保存不同的VBO ID是完全没有效率的,因此最好按照VertexNormalTexCoordColor - VNTC - VNTC ......的顺序打包它们,并将它们表示在一个VBO ID中。因此,上传到GPU时可以有效地使用缓冲区。所以这次我仍然将它们保存在向量中但是当我调用flush()时我想用结构包装它们,然后将该结构向量上传到GPU:

struct VBOData {
    glm::vec4 vert;
    glm::vec3 normal;
    glm::vec4 color;
    glm::vec2 texcoord;
};
std::vector<VBOData> vboBuffer;

然后我将所有内容上传到flush():

vboBuffer.reserve(vertexBuffer.size());

for (int i = 0; i < vertexBuffer.size(); ++i) {
    VBOData data;
    data.vert = vertexBuffer[i];
    data.color = colorBuffer[i];
    data.normal = normalBuffer[i];
    data.texcoord = texCoordBuffer[i];
    vboBuffer.push_back(data);
}

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vboBuffer.size() * sizeof(VBOData), (GLchar*) &vboBuffer[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

现在存在这个问题,如果我的对象不包含颜色,法线或tex坐标而且只包含顶点怎么办?或者只关于顶点和法线?或者总是有顶点的不同数据组合?为了提高效率,我能否以V(N)(T)(C)顺序动态打包它们?

1 个答案:

答案 0 :(得分:1)

  

现在存在这个问题,如果我的对象不包含颜色,法线或tex坐标而且只包含顶点怎么办?或者只关于顶点和法线?

然后,您将使用glVertexAttribPointer您未使用的组件集来设置偏移量。

顺便说一句,你有一篇关于维吾尔族人的opengl.org的精彩教程。