Opengl - 带有VBO纹理的OBJ文件的indexList(glDrawElements)

时间:2013-11-03 16:05:51

标签: opengl textures vbo .obj wavefront

我为opengl做了一个obj-loader。因此,我读取所有面(逐个)并在(openGL-)缓冲区(GL_ARRAY_BUFFER)中写入有序顶点,法线和uv-coords。这意味着我根据obj文件中的faces-section说明了所有必要的顶点,法线和uv-coords。然后我用glDrawArrays()

绘制它们

......一切都很好。

为了节省一些内存,我想使用索引列表,并使用glDrawElements(),但我有一个问题。请参阅以下两张图片:

a triangulated Quad

a UV-Map

考虑顶点P0和三角形以及它在OBJ文件的面部分中的内容

三角

T1 --> f   vertex(0)/P0/normal(0)   vertex(1)/P1/normal(1)   vertex(2)/P2/normal(2)

T2 --> f   vertex(0)/P0/normal(0)   vertex(1)/P1/normal(1)   vertex(5)/P5/normal(5)

T3 --> f   vertex(0)/P0/normal(0)   vertex(2)/P2/normal(2)   vertex(3)/P3/normal(3)

......一切都很好,但是

T4 --> f   vertex(0)/P'0/normal(0)   vertex(3)/P3/normal(3)   vertex(4)/P4/normal(4)

T5 --> f   vertex(0)/P'0/normal(0)   vertex(4)/P4/normal(4)   vertex(5)/P5/normal(5)

确定问题是什么?

vertex(0)/P0/normal(0) != vertex(0)/P'0/normal(0)

我认为的解决方案是:

  • 每个顶点,法线,uvs的列表
  • 阅读OBJ文件的faces-section
    • 获取顶点的索引 - >在顶点列表
    • 中的位置(索引)上写顶点
    • 在normal-List
    • 中写下正常位置(索引)
    • 在uv-List
    • 中的位置(索引)上写uv
    • 现在问题顶点有不同的uv-coord,因此
      • 检查list-element是否为“空”或不是0 - >确定有一个顶点,我们必须复制当前的顶点,法线和UV,并将它们写在所有列表中的新索引上,并将新索引写入索引列表

现在我的问题......

是否有更好的方法来处理obj文件的face-section中相同顶点的不同uv-coords的问题?

0 个答案:

没有答案