顶点数据分成单独的缓冲区还是一个结构?

在一个结构中拥有所有顶点数据是更好的:

class MyVertex { int x,y,z; int u,v; int normalx, normaly, normalz; } 

或者让每个组件(位置,法线,纹理坐标)在单独的数组/缓冲区中? 对我来说,将数据分组在一个结构中似乎是合乎逻辑的,因为它们对于共享顶点的每个实例总是相同的,而对于像人物模型这样的东西似乎是正确的(例如:法线应该是平均值用于平滑照明的相邻法线)。 这似乎不起作用的一个例子是其他types的网格,比如说一个立方体,每个立方体的纹理坐标可能是相同的,但是会导致它们在共享顶点的地方是不同的。

他们通常是分开的吗? 如果需要每个顶点的纹理坐标和法线的实例(它们不会被编入索引),这不会使它们的空间效率更低吗? OpenGL甚至可以在同一个VBO中处理索引(对于位置)与非索引缓冲区的混合吗?

把它们放在一起是很典型的。 然后当你创建你的VBO时,你可以很容易地生成一个交错的VBO与所有的数据。 创建VBO时,这是非常快速和典型的方法。

我有几个不同的顶点数据结构。 当我知道不会有任何特定types的数据时,我将忽略该数据types,只交错存在的数据types。 例如,我的一些模型有骨骼信息与顶点数据交错。 其他人不。 所以我有一个顶点结构,有额外的信息和一个没有。 我使用两个并分别绘制调用每个设置适当的指针。

鉴于GPUcaching的参考地点的重要性,一般的共识是, 除非情况阻止你这么做, 否则你应该总是默认交错顶点属性比如你提到的(半)共享环境。 有很多消息来源援引这一点。

如果数据集非常大,并且您真的不希望浪费空间/系统总线带宽来指定可选的交错属性,或者可以从较小的数据集中推导出来,那么交错并不重要。 例如在一个10M的顶点数据集中,如果你可以在其中的每个4个顶点组中使用相同的值,你可能会这样做。 但是对于较小的数据集,交叉和重复数据的容易性将忽略减less的需要。

交织的另一个原因是当你想要你的数据是模块化的,例如几何(即位置)保持不变,但颜色,法线贴图等改变时(考虑人类角色的几何形状,但是最近变成了Borg ,在皮肤下生长)。

在这里输入图像描述