Opengl es 三维物体的局部绘制

Opengl es 三维物体的局部绘制,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,目前的问题是,我的3D对象只是部分渲染。如果我有一个典型的圆柱体,两端都是“填充”的,那么两端渲染得很完美,而圆柱体本身不是。我附上一个例子来说明 这就是代码的构建方式: struct ObjMeshVertex{ Vector3f pos; Vector2f texcoord; Vector3f normal; }; struct ObjMeshFace{ ObjMeshVertex vertices[3]; }; struct ObjMesh{ s

目前的问题是,我的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);
}
抽签:

glBindVertexArrayOES(_boxVAO);
glDrawArrays(GL_TRIANGLES, 0, indicesize);  
其中indicatesize=myMesh.faces.size()

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

渲染结果如下所示:

我只渲染一个对象,而不是多个,这对于这种行为来说有点奇怪

球体并排:

最新渲染:


对于这个问题通常有多种解释

>P>对象加载程序被破坏或不考虑所有不同的OBJ特征,因此在负载

中,你会抛出顶点/面的弹跳。
  • 不过,OBJ文件不是三角剖分的,在这种情况下,通常不会松开整个“结构”,但只会注意到变形的面

  • 您有一个剔除问题,因此,一些面是通过调用绘制的,而不是通过Opengl的面剔除算法写入屏幕。要解决此问题,请尝试使用glDisable语句在OpenGL中禁用面剔除。这很容易测试。如果是这个问题,请注意不要在SW的生产版本中禁用剔除,因为面部剔除可以在性能方面挽救您的生命

  • 我希望这有帮助

    glDrawArrays(GLU三角形,0,指示)

    其中indicatesize=myMesh.faces.size()


    这就是问题所在。
    glDrawArrays
    的最后一个参数不是要绘制的基本体的数量(在您的例子中是三角形),而是数组元素(顶点)的数量,因此应该是
    3*myMesh.faces.size()
    。因此,目前您只绘制了大约三分之一的三角形。

    看起来整个子网格缺失,这可能是导入器/解析器或obj导出器的错误。你能用一个更简单的模型(立方体?球体?)重现这个吗。也许可以尝试在一个独立的OBJ查看器中验证模型(我相信Assimp有一个独立的)。我从未成功使用过Assimp,但我只是尝试渲染失败的af球体。虽然如果我从解析器中的打印输出手动初始化索引和顶点,它会呈现良好的效果。我怀疑我的代码中的faces部分可能有问题,我无法真正弄清楚。图像已附加。您确定obj写入程序没有发出四边形吗?根据obj规范,允许具有3个以上顶点的面。你需要对它们进行三角剖分。再者,你实际上不必使用或编译它们的代码,但我相信它们提供了一个独立的可执行OBJ查看器,你只需下载并单击即可查看OBJ。应该会告诉你网格本身是否有效。对不起。我忘了三角测量。那把球固定了很多。除了上面的一个小孔和它的一半不见了。我将看看他们的解析器。我已经附上了目前正在呈现的内容。我已经确定我的物体是三角形的。我已经检查了面,并与顶点和法线进行了比较,看起来还不错<代码>第3点看起来很有趣,但是什么时候我必须禁用它?作为一个补充,我正在尝试将我的对象加载到一个数组中,而不是我使用的主要方法。正如您在渲染中看到的,平面渲染非常好。顶部是渲染的,“前面”。我需要更新我的代码。我已将其更改为
    gldrawArray(GL_三角形,07055)7055与面数相同。正如我现在在面包师身上闻到的,应该是7055*3。该死。@JavaCake如果你有7055个面,那么它应该是
    glDrawArrays(GL_三角形,021165)
    。这就是我回答的重点。非常好。你让我开心!如果你来丹麦,请随时来找我喝杯啤酒或喝十杯:-)
    glBindVertexArrayOES(_boxVAO);
    glDrawArrays(GL_TRIANGLES, 0, indicesize);