我最近在使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
或其他东西。任何提示或请求更多信息。
答案 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);
还可以消除颜色/纹理坐标的步幅。