其他分享
首页 > 其他分享> > c – OBJ,缓冲区对象和面部索引

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

作者:互联网

我最近在使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或其他东西.任何提示或请求更多信息.

解决方法:

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

第二:

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

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

标签:wavefront,c,opengl,render
来源: https://codeday.me/bug/20190901/1786207.html