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

其中 indexize = 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, indexize);

其中 indexize = myMesh.faces.size()

这就是问题所在。的最后一个参数glDrawArrays不是要绘制的图元数量(在您的情况下为三角形),而是数组元素(顶点)的数量,因此应该是3 * myMesh.faces.size(). 所以目前你只画了所有三角形的三分之一。

于 2012-05-25T14:17:04.660 回答