我正在用 C++ 编写一个类来处理绘制 3D 模型(即三角形网格),我想知道如何最好地组织我的数据缓冲区。
这是我目前所知道的:
使用交错数组 加速代码。它利用空间局部性并增加缓存命中率。您可以通过将顶点组织到
struct
中来实现这一点,其中每个struct
都包含位置/法线/纹理坐标/等。该顶点的信息。使用索引数组通过存储每个不同的顶点/法线/纹理坐标/等来减少内存消耗。仅一次,然后通过对这些数组的引用来定义面孔,而不是冗余地指定每个面孔的所有信息。您也可以通过将索引的
结构
实现到顶点属性列表中。
我的问题:我应该如何最好地利用这两者?有可能两者都做吗?我听说对于这两者,您应该尽可能使用它们,但还没有发现任何关于同时使用两者或一个优先于另一个使用的信息。
我最初的解决方案:我打算实现一个结构,它在数据数组中有索引,并将这些结构的数组以及数据数组作为 VBO 传递,本质上是将两者结合起来.
我走在正确的轨道上吗?有一个更好的方法吗?我应该/不应该做什么?有什么我似乎没有意识到的会影响这个决定吗?
最佳答案
使用交错数组和索引并没有真正的关系。可以同时做这两件事,因为它们之间并没有太多关系。
如果您想将 VTNVTNVTN...(顶点、纹理、法线)等顶点打包到单个缓冲区中,或者将 VVV、TTT、NNN 打包到单独的缓冲区中,则使用或不使用交错数组只是一个选择。
如果您有足够多的重复顶点来证明使用索引缓冲区是合理的,那么使用索引只是一个决定。在做出此决定时,您是否交错顶点几乎无关紧要。
My initial solution: I was going to implement a struct that had indices into the data arrays and pass an array of these structs, as well as the data arrays, as VBOs, essentially combining the two.
这是非法的。请注意,您不会获得索引,您只会获得一个索引。您不能在对 texcoord #1 进行采样的同时对顶点 #0 进行采样。您提供的单个索引是所有 缓冲区的索引。
我怀疑这就是您最初感到困惑的原因,因为您认为您可以有多个索引。
关于OpenGL 交错索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372149/