4

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

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

.

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

这是渲染代码

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

对象是英雄联盟的伊泽瑞尔

我不确定我是否看错了这些面孔,或者它们是否甚至不是我认为的那样。我想使用GL_TRIANGLE_STRIP还是别的什么。任何提示或请求更多信息。

4

3 回答 3

4

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

于 2012-08-28T10:04:12.657 回答
2

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

第二:

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

除非您做了一些特殊的工作来将您在 .obj 文件中提供的人脸列表变成三角形条带,否则您没有三角形条带。你应该渲染GL_TRIANGLES,而不是条带。

于 2012-08-28T10:22:40.077 回答
0

从图像中可以肯定你的verticies被搞砸了。看起来您在 glGetAttribLocation 中指定了 9*sizeof(float) 的步幅,但从我从您的代码中可以看出,您的数组非常紧凑。

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

还从颜色/纹理坐标中删除步幅。

于 2019-07-29T15:55:30.013 回答