3

我正在使用一个处理 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)?

4

1 回答 1

2

有几种选择:

  • 为每个数据创建单独的 VBO:一个用于位置,一个用于法线等
  • 使用交错数据创建单个 VBO - 但这需要在您的代码中进行一些代码更改。

首先,我建议对一个顶点属性 + 索引缓冲区使用一个缓冲区:

索引缓冲区的一件事:

  • 您有 pos、normal、texture 的单独索引(您直接从 OBJ 文件中获取这些值),但如果您使用 IBO(索引缓冲区对象)绘制几何图形,则需要创建单一索引。

这是我的一些代码:

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);
}

它能做什么:

  • 它对每个 pos、nomal 和 tex cood 都有一个向量……但是当 OBJ 文件中有一个“f”标志时,我会检查我的缓存中是否有一个三元组。
  • 如果有这样的三元组,我将该索引放入节点的索引中
  • 如果不是,我需要创建新索引
于 2012-05-21T08:19:11.667 回答