在 IBO 中使用索引和法线是否有意义

Does it make sense to have indices and normals in VBOs

我正在编写一个在 OpenGL 中渲染一些网格的插件。

我在一个 VBO 中有一个顶点数组,在另一个 VBO 中有一个索引数组。我现在想存储法线。作为一个顶点,在多个面之间共享,具有不同的法线,看来我必须多次复制顶点,因此失去了索引的使用。

例如,要存储一个带有顶点和索引的立方体,我需要 8 个顶点和 24 个索引(每个面 4 个)。但是,如果我想存储法线,我是否需要存储 24 个顶点(每个 3 个面有 8 个)、24 个索引(所有顺序)和 24 个法线?

我看得对吗,因此索引变得无用,或者有没有办法不重复顶点并且每个顶点都有多个法线?

没那么容易。索引有一个很棒的特性,叫做 原始重启索引。它可以让你描述你的形状,例如GL_TRIANGLE_STRIP,因此对同一网格使用更少的索引。此外,模型的平滑部分共享一些顶点,通常共享的数据多于重复的顶点,所以最后它是一个净赢。

现在考虑您的多维数据集示例。令 I 为索引类型的大小,V 为顶点数据的大小。让我们采用 I = sizeof(uint) = 4V = 3*sizeof(float) + 4*sizeof(byte) = 16(三个浮点数和一个低精度法线)。

glDrawArraysGL_TRIANGLES 每个面需要两个三角形,即 2*3*6*V = 512 字节。

glDrawElementsGL_TRIANGLE_STRIP 每个面需要四个索引加上一个重新启动索引,即 5*6*I = 120 字节,每个面四个顶点,即 4*6*V = 384 字节。总共 504 个字节。

如您所见,即使使用那个立方体示例和一些保守的类型选择,索引方法仍然在内存占用方面胜出。实际上,您可以使用 short 索引并且可能需要更高精度的法线,这将更加偏向于索引方法。

您只需复制锐边顶点,但网格通常有许多不需要复制的其他顶点(如曲率曲面)。

所以指数并没有失去它们的目的。 8 顶点立方体只是一个错误的例子....尝试制作一个具有规则顶点覆盖的立方体让每个面说 4x4 = 16 个顶点,突然你只需要复制边缘顶点......边缘和内部之间的比率顶点通常有利于内部顶点