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

Posted

技术标签:

【中文标题】OBJ、缓冲区对象和面部索引【英文标题】:OBJ, Buffer objects, and face indices 【发布时间】:2012-08-22 19:43:23 【问题描述】:

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

我不太擅长用 C++ 读取文件,所以我写了一个 Python 文档来解析 obj 并编写 2 个单独的 txt 来给我一个顶点数组和面索引,并将它们直接粘贴到我的代码中。这就像 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

物品是英雄联盟的伊泽瑞尔

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

【问题讨论】:

现代艺术+1。这个...东西的顶部...实际上看起来像Ezrael的发型,如果你发挥你的想象力xD 既然您的问题几乎可以肯定是在您的 .obj 代码中,而不是在您的渲染代码中,为什么不告诉我们您的实际问题在哪里? 【参考方案1】:

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

【讨论】:

不,除非你想要一个新的选择,否则它看起来几乎一样。我使用的原语是否正确? 我从他们中拿了一张。我去搜索,我找到了 1,但我找不到任何 0。身份证。【参考方案2】:

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

第二:

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

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

【讨论】:

好的,所以我不确定 objs 在三角形中工作。非常感谢。我忘记了,一旦我改变了面孔,我就需要绘制元素。我不知道我在用drawarrays在想什么,它甚至不使用索引XD。从面减去一,使用三角形并绘制元素。耶!它是如此的万花筒 O.o @Kaliber64:实际上,objs 可以有任何类型的多边形,通常你必须先对数据进行三角剖分。 是的,我现在想出了一大堆。我为 Quads 找到了一个,但如果每张脸只有 2 个数字,那是什么?行? 我将它渲染为线条并且它起作用了。结果我无法让搅拌机输出带有三角形或四边形的 obj。只是线框。 Max 和 Maya 将加载 obj。说什么都没有加载:S. 刚刚将导出的 .obj 与打开的 Blender 索引进行比较,结果不匹配【参考方案3】:

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

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

同时从颜色/纹理坐标中移除步幅。

【讨论】:

以上是关于OBJ、缓冲区对象和面部索引的主要内容,如果未能解决你的问题,请参考以下文章

3 个索引缓冲区

OpenGL 顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?

关于 .obj 3d 模型格式和 VBO

VAO 绘制错误的索引缓冲区

我可以设置 openGL 缓冲区以按照与 OBJ 文件类似的原理工作吗?

是否可以将索引缓冲区对象 (IBO) 与函数“glMultiDrawElements”一起使用?