【问题标题】:OBJ, Buffer objects, and face indicesOBJ、缓冲区对象和面部索引
【发布时间】: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 代码中,而不是在您的渲染代码中,为什么不告诉我们您的实际问题在哪里?

标签: c++ opengl render wavefront


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多