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のOpenGLES1.1で行ったように、データをロードするにはどうすればよいですか?

vまた、個別の位置()ではなく、ベクトル()をロードすることも可能float x,y,zですか?

4

1 に答える 1

2

いくつかのオプションがあります:

  • データごとに個別のVBOを作成します。1つは位置用、もう1つは法線用などです。
  • インターリーブされたデータを使用して単一のVBOを作成しますが、これにはコードのコードを少し変更する必要があります。

まず、1つの頂点属性+インデックスバッファに1つのバッファを使用することをお勧めします。

インデックスバッファに関する1つのこと:

  • 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」フラグがある場合は、キャッシュにトリプルがあるかどうかを確認します。
  • そのようなトリプルがある場合は、そのインデックスをノードのインデックスに入れます
  • そうでない場合は、新しいインデックスを作成する必要があります
于 2012-05-21T08:19:11.667 に答える