0

Wavefront OBJ パーサーを実行していますが、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、データを簡単にロードできます。

しかし、これがどのように行われるのかわかりませんか?

セットアップの編集:

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

どこ indexsize = myMesh.faces.size()

4

1 に答える 1

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

確認する必要があるかもしれないことの 1 つは、構造体がパディングされていないことです (これを有効/無効にする方法についてはよくわかりません)。

再確認して、次のことを主張してください。

sizeof(ObjMeshVertex) == 2 * sizeOf(Vector3f) + sizeOf(Vector2f);
sizeof(ObjMeshFace) == 3 * sizeOf(ObjMeshVertex);

これが当てはまらない場合は、構造体のパディングを調整する必要があるかもしれません。

于 2012-05-23T22:19:32.367 に答える