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

Opengl 顶点属性具有不同索引时的策略,opengl,vertices,Opengl,Vertices,我有一个已经解析过的OBJ文件,但并不奇怪顶点位置和顶点纹理的索引是分开的 这里有几行OBJ代码,用不同的索引明确了我的意思。这些是四边形,其中第一个索引引用XYZ位置,第二个索引引用UV坐标: f 3899/8605 3896/8606 720/8607 3897/8608 f 3898/8609 3899/8610 3897/8611 721/8612 我知道解决办法是做一些复制,但最聪明的方法是什么? 根据now,我有两个选择: 1) 使用索引创建两大组顶点和顶点纹理坐标。这意味着我将复

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

这里有几行OBJ代码,用不同的索引明确了我的意思。这些是四边形,其中第一个索引引用XYZ位置,第二个索引引用UV坐标:

f 3899/8605 3896/8606 720/8607 3897/8608
f 3898/8609 3899/8610 3897/8611 721/8612
我知道解决办法是做一些复制,但最聪明的方法是什么? 根据now,我有两个选择:

1) 使用索引创建两大组顶点和顶点纹理坐标。这意味着我将复制所有内容,这样我将盲目地为面中的每对v/vt创建一个顶点。例如,如果我在第一个面中有1/3,在另一个面中有相同的1/3,我将得到两个独立的顶点。然后继续使用gldrawArray,不再使用索引,而是使用新创建的集合(充满重复项)

2) 检查每个面顶点,找出唯一的“GL顶点”(位置+纹理坐标在我的具体案例中是相同的),并找出使用这些顶点进行索引的方法。与1不同的是,在这里,我不认为是同一对夫妇发现的多个独立的顶点。然后,我将为这些新顶点创建一个新的索引,最后在使用新索引进行draw调用时使用glDrawElements

现在我相信第一个选项更简单,但我想每个drawArrays调用都会比drawElement慢一点,对吗?我的优势有多大

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


有没有其他方法来解释这个问题

如果您的低多边形模型很少,请选择选项1,这样更容易实现,性能差异也不会明显

如果您有一些高多边形模型(查看示例,其中至少有9k个顶点),选项#2将是正确的方法

一般来说,您不应该担心模型加载时间,因为这只需要执行一次,之后您可以将其转换/保存为所需的最佳格式(按代码中存储的方式序列化)


这两种方法的分界线在哪里?如果在目标硬件和顶点渲染管道(骨骼动画、阴影、一切都会增加其代价)上没有真实的评测,就无法说。

请您添加一个小例子,“顶点位置和顶点纹理的索引是如何不同的”,OBJ中的一些5-6行显示了这一点。我想我有一个想法,但我需要先看看细节。@KromStern我添加了几行,这应该可以更好地解释,对不起,如果一开始不清楚,第一种方法将不起作用。不能基于顶点属性为纹理坐标编制索引。对于位置和纹理,必须使用相同的索引。据我所知,第二种方法基本上是复制方法。@NicoSchertler对不起,我的描述太草率了。我已经编辑过了,希望现在更清晰。我担心你得试试哪一个更快。第二个选项的唯一好处是它消耗更少的内存(传输到GPU时速度更快)。但由于这只做了一次,我想性能上的好处是微不足道的。