顶点属性具有不同索引的策略

时间:2014-02-27 00:53:08

标签: opengl vertices

我有一个我已经解析过的OBJ文件,但对于顶点位置和顶点纹理的索引并不奇怪。

这里有一些OBJ行来明确我对不同索引的含义。这些是四边形,其中第一个索引引用XYZ位置,第二个索引引用UV坐标:

f 3899/8605 3896/8606 720/8607 3897/8608
f 3898/8609 3899/8610 3897/8611 721/8612

我知道解决方案是做一些重复,但最聪明的方法是什么? 现在我记住了这两个选项:

1)使用索引创建两组大的顶点和顶点纹理坐标。这意味着我复制了所有内容,这样我就会盲目地为每个情侣v / vt中的顶点添加一个顶点。如果我在第一张脸上有1/3,在不同的脸上有相同的1/3,我最终会得到两个不同的顶点。继续使用glDrawArrays而不再使用索引,但是新创建的集合(完全重复)

2)检查每个面顶点来到唯一的“GL顶点”(位置+纹理坐标在我的具体情况下是相同的)并找出一种使用这些顶点索引的方法。不同于1)这里我不会将多次发现的同一对视为单独的顶点。然后,我将为这些新顶点创建一个新的索引,最后在使用新索引进行绘制调用时使用glDrawElements。

现在我相信第一个选项更简单,但我猜每个drawArrays调用都会比drawElement更慢吗?我有多少这样的优势?

作为第一个想法的第二个选项在预处理步骤中看起来相当慢,并且实现起来更复杂。但它会给我带来更好的整体表现吗?

还有其他方法可以解决此问题吗?

1 个答案:

答案 0 :(得分:0)

如果您的低多边形模型很少 - 请选择#1选项,这样更容易实现,并且性能差异将无法察觉。

如果你有一些高多边形模型,那么

选项#2将是正确的方法(查看样本,你至少有9k个顶点)。

一般情况下,您不必担心模型加载时间,cos只执行一次,然后您可以以您需要的最佳格式转换/保存它(将其序列化为存储在代码中的方式)

这两种方法之间的分界线在哪里?如果没有对目标硬件和顶点渲染管道进行真实剖析(骨架动画,阴影,一切都会增加收费),这是不可能的。

相关问题