OpenGL交错索引数组

Gra*_*her 3 opengl 3d optimization vbo

我正在编写一个C++类来处理绘制3D模型(即三角形网格),我想知道如何最好地组织我的数据缓冲区.

这是我目前所知道的:

  • 使用交错数组可加快代码速度.它利用空间局部性并增加缓存命中率.你可以通过将顶点组织成structs 来实现这一点,其中每个顶点都struct包含位置/ normal/texcoord/etc. 该顶点的信息.

  • 使用索引数组通过存储每个不同的顶点/ normal/texcoord/etc来减少内存消耗.只有一次,然后通过对这些数组的引用来定义面,而不是冗余地指定每个面的所有信息.您可以与实现这一struct指标为顶点属性的列表.

我的问题:我应该如何最好地利用这两者?这两个都可以吗?我已经听说过你应该尽可能地使用它们,但是没有发现任何关于同时使用它们或者一个使用它们的任何事情.

我的初始解决方案:我将实现一个结构,该结构具有索引到数据数组中,并传递这些结构的数组,以及数据数组,作为VBO,基本上将两者结合起来.

我是在正确的轨道上吗?有一个更好的方法吗?我应该/不应该做什么?有什么我似乎不知道会影响这个决定吗?

Tim*_*Tim 5

使用交错数组和索引并不是真正相关的.可以同时做两件事,因为他们彼此并没有多大关系.

如果要将顶点像VTNVTNVTN ...(顶点,纹理,法线)打包在单个缓冲区中,或者将VVV,TTT,NNN打包在不同的缓冲区中,则可以选择是否使用交错数组.

如果你有足够的重复顶点来证明使用索引缓冲区,那么使用索引只是一个决定.做出这个决定时,如果你交错了顶点,那几乎无关紧要.

我的初始解决方案:我将实现一个结构,该结构具有索引到数据数组中,并传递这些结构的数组,以及数据数组,作为VBO,基本上将两者结合起来.

这是非法的.请注意,您没有索引,只能获得一个索引.在对texcoord#1进行采样的同时,不能对顶点#0进行采样.您提供的单个索引是所有缓冲区的索引.

我怀疑这就是你最初感到困惑的原因,因为你认为你可能有多个指数.