部分渲染3D对象

时间:2012-05-25 08:15:46

标签: opengl-es opengl-es-2.0

目前的问题是我的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);  

其中indicesize = myMesh.faces.size()

所以我的对象看起来像这样:

enter image description here

渲染结束如下:

enter image description here

我只渲染1个对象,而不是多个,这对于这种行为似乎有点奇怪。

球体并排:

enter image description here

最新渲染:

enter image description here

2 个答案:

答案 0 :(得分:2)

通常可以对此问题进行多种解释。

  1. OBJ加载程序已损坏或未考虑所有不同的OBJ功能,因此您在负载中放下了顶点/面的反弹

  2. 虽然OBJ文件没有进行三角测量,但在这种情况下,您通常不会松开“结构”的整个部分,但只是注意到格式不正确的面孔。

  3. 您遇到了剔除问题,因此,部分面孔是由您的调用绘制的,但未通过Opengl的面部剔除算法写在屏幕上。要解决此问题,请尝试使用glDisable语句禁用OpenGL中的Face Culling。它很容易测试。如果是问题,请注意不要在生产版本的SW中禁用剔除,因为面部剔除可以节省你的生活性能。

  4. 我希望这会有所帮助

答案 1 :(得分:1)

  

glDrawArrays(GL_TRIANGLES,0,indicesize);

     

其中indicesize = myMesh.faces.size()

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