我正在编写一个插件,在OpenGL中渲染一些网格.我在VBO中有一个Vertices数组,在另一个VBO中有一个Indices数组.我现在想要存储法线.作为一个顶点,在多个面之间共享,具有不同的法线,似乎我必须复制顶点倍数,因此失去了索引的使用.
例如,要存储具有顶点和索引的立方体,我需要8个顶点和24个索引(每个面4个).但是,如果我想存储法线,我是否需要存储24个顶点(每个3个面8个),24个索引(所有顺序)和24个法线?
我看到它是正确的,因此指数变得无用,或者有没有办法不复制顶点,无论如何每个顶点有多个法线? 最佳答案 不那么容易.索引具有称为原始重启索引的强大功能.它可以让你描述你的形状,例如: GL_TRIANGLE_STRIP,因此对同一网格使用较少的索引.此外,模型的平滑部分共享一些顶点,并且通常您拥有比重复顶点更多的共享数据,因此最终它是一个净赢.
现在考虑你的立方体示例.设I是索引类型的大小,V是顶点数据的大小.让我们采用I = sizeof(uint)= 4和V = 3 * sizeof(float)4 * sizeof(byte)= 16(三个浮点数用于位置和一个低精度法线).
带GL_TRIANGLES的glDrawArrays每个面需要两个三角形,即2 * 3 * 6 * V = 512字节.
带有GL_TRIANGLE_STRIP的glDrawElements每个面需要四个索引加上一个重启索引,即5 * 6 * I = 120字节,每个面有四个顶点,即4 * 6 * V = 384字节.这总共是504个字节.
正如您所看到的甚至使用该多维数据集示例和一些保守类型选择,索引方法仍然在内存占用上获胜.实际上,您可以使用短指数并且可能需要更高的精度法线,这将更偏向于索引方法.