1

現時点での問題は、3D オブジェクトが部分的にしかレンダリングされないことです。両端が「満たされている」典型的な円柱がある場合、端は完全にレンダリングされますが、円柱自体はそうではありません。説明する例を添付しました。

コードの作成方法は次のとおりです。

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

設定:

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

したがって、私のオブジェクトは次のようになります。

ここに画像の説明を入力

レンダリングは次のようになります。

ここに画像の説明を入力

そして、複数ではなく1つのオブジェクトのみをレンダリングしているため、この動作には少し奇妙に思えます。

球を並べて表示:

ここに画像の説明を入力

最新のレンダリング:

ここに画像の説明を入力

4

2 に答える 2

2

通常、この問題には複数の説明があります。

  1. OBJローダーが壊れているか、すべての異なるOBJ機能を考慮していないため、ロードで頂点/面のバウンスをドロップします

  2. OBJファイルは三角形分割されていませんが、この場合、通常は「構造」の一部全体を失うことはありませんが、不正な形状の面に気付くだけです。

  3. カリングの問題があるため、一部の面は呼び出しによって描画されますが、Openglの面カリングアルゴリズムによって画面に書き込まれません。この問題のトラブルシューティングを行うには、glDisableステートメントを使用してOpenGLでフェイスカリングを無効にしてみてください。テストはとても簡単です。それが問題になる場合は、フェイスカリングがパフォーマンスの面であなたの命を救うので、SWの製品版でカリングを無効にしないように注意してください。

これがお役に立てば幸いです

于 2012-05-25T12:15:10.690 に答える
1

glDrawArrays(GL_TRIANGLES, 0, indexsize);

どこ indexsize = myMesh.faces.size()

そして、それが問題です。への最後の引数glDrawArraysは、描画するプリミティブ (この場合は三角形) の数ではなく、配列要素 (頂点) の数であるため、 である必要があります3 * myMesh.faces.size()。したがって、現時点では、すべての三角形の約 3 分の 1 しか描画していません。

于 2012-05-25T14:17:04.660 に答える