使用c ++和opengl加载obj文件的错误

时间:2016-04-10 06:42:16

标签: c++ opengl

我写了obj loader并得到了以下内容:enter image description here

它是黄色的老鹰,但是你看到它有一些额外的三角形从它的腿到翅膀。我使用的代码:

{....
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glBufferData(GL_ARRAY_BUFFER,sizeof(data),data,GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,numOfIndices*sizeof(GLuint),indices,GL_STATIC_DRAW);
}

void Mesh::draw( )
{

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glVertexAttribPointer(
            0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
            3,                  // size
            GL_FLOAT,           // type
            GL_FALSE,           // normalized?
            0,                  // stride
            (void*)0            // array buffer offset
        );
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo);
    glDrawElements(GL_TRIANGLES,numOfIndices,GL_UNSIGNED_INT,(void*)0  );
    glDisableVertexAttribArray(0);
}

其中数据是顶点数组,索引是索引数组。

当我以obj格式保存数据和索引并在3D编辑器中打开结果文件时,eagle看起来很好并且没有这些额外的三角形(这意味着数据和索引都很好)。

我花了好几个小时试图修复代码并让老鹰看起来很正常,但现在我已经没想完了。所以,如果您有任何想法如何让老鹰正常与我分享,那么请。

对于那些认为问题出现在加载程序中的人来说,obj模型的屏幕是由加载器中的数据构成的(来自data []和indices [])enter image description here

1 个答案:

答案 0 :(得分:2)

Finally found solution.

Indexing in obj. format starts at 1 (not 0 ) and when you load vertices to GL_ARRAY_BUFFER vertex #1 becomes vertex#0 and whole indexing breaks.

Therefore it is necessary to decrease all values of indices by 1 and then index that pointed to vertex #1 will point to vertex #0 and indexing will become correct.