OBJ,缓冲区对象和面部索引

时间:2012-08-28 10:00:52

标签: c++ opengl render wavefront

我最近在使Vertex缓冲区对象工作方面取得了很大进展。 所以我转向了Element数组,我想通过这样的实现,我可以从obj加载顶点和面部数据。

我不太擅长用c ++读取文件所以我编写了一个python doc来解析obj并编写2个单独的txts来给我一个顶点数组和面部索引并将它们直接粘贴在我的代码中。这就像6000行,但它的工作原理(没有编译错误)。 这就是它的样子

我认为他们错了。我不确定。刚刚从obj中提取的顶点和面的顺序不会改变,因为我还没有法线或纹理适用于缓冲区对象。如果你看看立方体,我会这样做但不是真的。

继承人render code

void Mesh_handle::DrawTri(){
    glBindBuffer(GL_ARRAY_BUFFER,vertexbufferid);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elementbufferid);
    int index1=glGetAttribLocation(bound_program,"inputvertex");
    int index2=glGetAttribLocation(bound_program,"inputcolor");
    int index3=glGetAttribLocation(bound_program,"inputtexcoord");

    glEnableVertexAttribArray(index1);
    glVertexAttribPointer(index1,3,GL_FLOAT,GL_FALSE,9*sizeof(float),0);

    glEnableVertexAttribArray(index2);
    glVertexAttribPointer(index2,4,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)(3*sizeof(float)));

    glEnableVertexAttribArray(index3);
    glVertexAttribPointer(index3,2,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)(7*sizeof(float)));

    glDrawArrays(GL_TRIANGLE_STRIP,0,elementcount);
    //glDrawElements(GL_TRIANGLE_STRIP,elementcount,GL_UNSIGNED_INT,0);
}

我的python解析器只将信息写入文件:source

该对象是来自英雄联盟的Ezreal

我不确定我是否错误地读了这些面孔,或者他们的面孔是不是我认为的那样。我想使用GL_TRIANGLE_STRIP或其他东西。任何提示或请求更多信息。

3 个答案:

答案 0 :(得分:3)

obj文件中的索引是基于1的,因此您必须从所有索引中减去1才能将它们与OpenGL一起使用。

答案 1 :(得分:2)

首先,正如Andreas所说,.obj文件使用基于1的索引,因此您需要将它们转换为基于0的索引。

第二

glDrawArrays(GL_TRIANGLE_STRIP,0,elementcount);
//glDrawElements(GL_TRIANGLE_STRIP,elementcount,GL_UNSIGNED_INT,0);

除非你做了一些特别的工作来将你的.obj文件中的面部列表转换为三角形 strip ,否则你没有三角形条。你应该渲染GL_TRIANGLES,而不是条纹。

答案 2 :(得分:0)

从图像中确定您的顶点被弄乱了。看起来您在glGetAttribLocation中指定了9 * sizeof(float)的步幅,但是从我的代码中可以看出,数组是紧密包装的。

glEnableVertexAttribArray(index1);
glVertexAttribPointer(index1,3,GL_FLOAT,GL_FALSE,0,0);

还可以消除颜色/纹理坐标的步幅。