我有一个Wavefront OBJ Parser正在运行,但在花了无数个小时试图弄清楚我如何在OpenGL中加载数据后我最终不得不放弃。
这是代码的构建方式:
struct ObjMeshVertex{
Vector3f pos;
Vector2f texcoord;
Vector3f normal;
};
struct ObjMeshFace{
ObjMeshVertex vertices[3];
};
struct ObjMesh{
std::vector<ObjMeshFace> faces;
};
ObjMesh myMesh;
for(size_t i = 0; i < faces.size(); ++i){
ObjMeshFace face;
for(size_t j = 0; j < 3; ++j){
face.vertices[j].pos = positions[faces[i].pos_index[j] - 1];
face.vertices[j].texcoord = texcoords[faces[i].tex_index[j] - 1];
face.vertices[j].normal = normals[faces[i].nor_index[j] - 1];
}
myMesh.faces.push_back(face);
}
通常,当我创建一个简单的多维数据集时,该数组看起来像这样:{posX, posY, posZ, normX, normY, normZ}
。
通过使用glVertexAttribPointer
的偏移量来加载数据非常简单。
但我不知道这是怎么做到的?
EDIT 设置:
glGenVertexArraysOES(1, &_boxVAO);
glBindVertexArrayOES(_boxVAO);
int sizeOfFaces = myMesh.faces.size() * sizeof(ObjMeshFace);
glGenBuffers(1, &_boxBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _boxBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeOfFaces, &(myMesh.faces[0]), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(ObjMeshVertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(ObjMeshVertex), (void*)offsetof(ObjMeshVertex, texcoord));
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE ,sizeof(ObjMeshVertex), (void*)offsetof(ObjMeshVertex, normal));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glBindVertexArrayOES(0);
画画:
glBindVertexArrayOES(_boxVAO);
glDrawArrays(GL_TRIANGLES, 0, indicesize);
其中indicesize = myMesh.faces.size()
答案 0 :(得分:3)
如果您只是询问如何将数据发送到glBufferData,那么您只需获取指向myMesh中第一个面的指针,并在其上调用glBufferData(假设所有内容都紧密包装)。
int sizeOfFaces = myMesh.faces.size() * sizeof(ObjMeshFace);
glBufferData(GL_ARRAY_BUFFER, sizeOfFaces, &(myMesh.faces[0]), usage);
然后你可以设置指向这个交错结构的指针:
glVertexPointer(3, GL_FLOAT, sizeof(ObjMeshVertex), 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(ObjMeshVertex), (void*)(sizeof(Vector3f)));
glNormalPointer(3, GL_FLOAT, sizeof(ObjMeshVertex), (void*)(sizeof(Vector3f) + sizeof(Vector2f)));
您可能需要检查的一件事是您的结构未被填充(我不太确定如何启用/禁用此功能)。
只需仔细检查并断言:
sizeof(ObjMeshVertex) == 2 * sizeOf(Vector3f) + sizeOf(Vector2f);
sizeof(ObjMeshFace) == 3 * sizeOf(ObjMeshVertex);
如果不是这样,您可能需要对struct padding进行一些调整。