我正在处理一个处理Wavefront OBJ 3D对象文件的解析器,我不太确定我是否正确加载到OpenGL中。
所以基本上我所做的就是我阅读了我的Wavefront OBJ文件并解析了所有数据。
通常在OpenGL ES 1.1中我会在加载数据时执行以下操作:
glBegin(GL_TRIANGLES);
glNormal3f(normals[faces[i].normal[0]].v[0], normals[faces[i].normal[0]].v[1], normals[faces[i].normal[0]].v[2]);
glVertex3f(vertices[faces[i].vertex[0]].v[0], vertices[faces[i].vertex[0]].v[1], vertices[faces[i].vertex[0]].v[2]);
glNormal3f(normals[faces[i].normal[1]].v[0], normals[faces[i].normal[1]].v[1], normals[faces[i].normal[1]].v[2]);
glVertex3f(vertices[faces[i].vertex[1]].v[0], vertices[faces[i].vertex[1]].v[1], vertices[faces[i].vertex[1]].v[2]);
glNormal3f(normals[faces[i].normal[2]].v[0], normals[faces[i].normal[2]].v[1], normals[faces[i].normal[2]].v[2]);
glVertex3f(vertices[faces[i].vertex[2]].v[0], vertices[faces[i].vertex[2]].v[1], vertices[faces[i].vertex[2]].v[2]);
glEnd();
对于OpenGL ES 2.0,我试过没有运气的顶点:
glBufferData(GL_ARRAY_BUFFER, obj.vertices.size()*sizeof(float), &(obj.vertices[0].v), GL_STATIC_DRAW);
我的数据结构:
struct vertex {
std::vector<float> v;
}
使用v
为每个顶点场景创建{x,y,z}
向量。
class waveObj {
public:
std::vector<vertex> vertices;
std::vector<vertex> texcoords;
std::vector<vertex> normals;
std::vector<vertex> parameters;
std::vector<face> faces;
}
struct face {
std::vector<int> vertex;
std::vector<int> texture;
std::vector<int> normal;
};
如何加载我的数据,就像我在2.0中使用OpenGL ES 1.1一样?
甚至可以加载矢量(v
),而不是单独的位置(float x,y,z
)?
答案 0 :(得分:2)
有几种选择:
首先,我建议为一个顶点attrib + index buffer使用一个缓冲区:
索引缓冲区的一件事:
这是我的一些代码:
map<FaceIndex, GLushort, FaceIndexComparator>::iterator
cacheIndex = cache.find(fi);
if (cacheIndex != cache.end()) {
node->mIndices.push_back(cacheIndex->second);
}
else {
node->mPositions.push_back(positions[fi.v]);
node->mNormals.push_back(normals[fi.n]);
node->mTexCoords.push_back(texCoords[fi.t]);
node->mIndices.push_back((unsigned int)node->mPositions.size()-1);
cache[fi] = ((unsigned int)node->mPositions.size()-1);
}
它的作用: