使用OpenGL ES 2.0在glBufferData中加载顶点

时间:2012-05-21 07:41:39

标签: opengl-es opengl-es-2.0

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

1 个答案:

答案 0 :(得分:2)

有几种选择:

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

首先,我建议为一个顶点attrib + index buffer使用一个缓冲区:

索引缓冲区的一件事:

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

这是我的一些代码:

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”标志时,我会检查我的缓存中是否有三元组。
  • 如果有这样的三元组我将该索引放在我的节点的索引
  • 如果不是我需要创建新索引