这主要与缓存有关。例如,假设我们有 4 个顶点和 4 个颜色。您可以通过这种方式提供信息(对不起,我不记得确切的函数名称)
glVertexPointer(..., vertex);
glColorPointer(..., colors);
它内部的作用是读取顶点[0],然后应用颜色[0],然后再次应用颜色[1] 的顶点[1]。如您所见,如果 vertex 的长度为 20 兆字节,则 vertex[0] 和 Colors[0] 至少可以彼此相距 20 兆字节。
现在,另一方面,如果您提供像 { vertex0, color0, vertex1, color1, etc.} 这样的结构,将会有大量缓存命中,因为 vertex0 和 color0 在一起,vertex1 和 color1 也在一起。
希望这有助于回答这个问题
编辑:第二次阅读时,我可能没有回答这个问题。您可能想知道 OpenGL 如何知道要从该结构中读取哪些值?就像我之前所说的,使用诸如 { vertex, color, vertex, color } 之类的结构,您告诉 OpenGL 顶点位于位置 0,偏移量为 2(因此下一个将位于位置 2,然后是 4,等等)和颜色从位置 1 开始,偏移量也为 2(因此位置 1,然后是位置 3,依此类推)。
另外:如果您想要更实际的示例,请查看此链接http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_(VBO) http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_(VBO)。您可以看到它如何只提供一次缓冲区,然后使用偏移量来有效渲染。