我正在编写一个C ++类来处理绘制3D模型(即三角形网格),我想知道如何最好地组织我的数据缓冲区。
这是我目前所知道的:
使用交错数组可加快代码速度。它利用空间局部性并增加缓存命中率。您可以通过将顶点组织到struct
中来实现这一点,其中每个struct
保持位置/ normal / texcoord / etc.该顶点的信息。
使用索引数组通过存储每个不同的顶点/ normal / texcoord / etc来减少内存消耗。只有一次,然后通过对这些数组的引用来定义面,而不是冗余地指定每个面的所有信息。您也可以 使用struct
个索引将其实现为顶点属性列表。
我的问题:我应该如何最好地利用这两个?这两个都可以吗?我已经听说过,你应该尽可能地使用它们,但是没有找到任何关于同时使用它们或者一个在另一个上面使用它们的事情。
我最初的解决方案:我打算实现一个结构,该结构具有索引到数据数组中并传递这些结构的数组,以及数据数组,作为VBO,基本上将两者结合起来
我是否在正确的轨道上?有一个更好的方法吗?我应该/不应该做什么?有什么我似乎不知道会影响这个决定吗?
答案 0 :(得分:5)
使用交错数组和索引并不是真正相关的。可以同时做两件事,因为他们彼此并没有多大关系。
如果要将顶点像VTNVTNVTN ...(顶点,纹理,法线)打包在单个缓冲区中,或者将VVV,TTT,NNN打包在不同的缓冲区中,
可以选择是否使用交错数组。
如果您有足够的重复顶点来证明索引缓冲区的使用是合理的,那么使用索引只是一个决定。在做出这个决定时,如果你交错了顶点,那几乎无关紧要。
我的初始解决方案:我将实现一个结构,该结构具有索引到数据数组中,并将这些结构的数组以及数据数组作为VBO传递,基本上将两者结合起来。
这是非法的。请注意,您没有索引,只能获得一个索引。在对texcoord#1进行采样的同时,无法对顶点#0进行采样。您提供的单个索引是缓冲区的所有的索引。
我怀疑这就是你最初感到困惑的原因,因为你认为你可能有多个指数。