4

我为opengl 制作了一个obj-loader。因此,我读取所有面(一个接一个)并将有序顶点、法线和 uv 坐标写入(openGL-)缓冲区(GL_ARRAY_BUFFER)中。这意味着我根据 obj 文件中的 faces-section 内容复制所有必要的顶点、法线和 uv 坐标。然后我用 glDrawArrays() 绘制它们

……一切都好。

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

三角四边形

紫外线贴图

考虑顶点 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 坐标,因此
      • 检查列表元素是否“空”或不是 0 --> 好的,有一个顶点,我们必须复制当前顶点、法线和 UV,并将它们写入所有列表中的新索引,并写入新索引到索引列表

现在我的问题...

有没有更好的方法来处理 obj 文件的面部分中相同顶点的不同 uv 坐标的问题?

4

0 回答 0