在 VBO 中有索引和法线是否有意义

Lau*_*llo 6 opengl vbo normals

我正在编写一个插件,它在 OpenGL 中呈现一些网格。

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

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

我看对了吗,因此索引变得无用,还是有办法不复制顶点并且每个顶点有多个法线?

ybu*_*ill 3

没那么容易。索引有一个很棒的功能,称为原始重启索引。它允许您使用例如 来描述您的形状,GL_TRIANGLE_STRIP从而对同一网格使用更少的索引。此外,模型的平滑部分共享一些顶点,并且通常您拥有比重复顶点更多的共享数据,因此最终这是一个净赢。

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

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

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

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

  • 每个顶点。法线是顶点属性,就像任何其他顶点属性一样,包括位置、纹理坐标、漫反射颜色,等等。 (2认同)