3

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

到目前为止,这是我所知道的:

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

  • 使用索引数组通过存储每个不同的顶点/法线/texcoord/等来减少内存消耗。仅一次,然后通过对这些数组的引用来定义人脸,而不是为每个人脸冗余地指定所有信息。你也可以一个索引来实现这个struct到顶点属性列表中。

我的问题:我应该如何最好地利用这两者?有可能两者都做吗?我听说两者都应该尽可能地使用它们,但没有发现任何关于同时使用它们或两者兼而有之的东西。

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

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

4

1 回答 1

5

使用交错数组和索引并不真正相关。可以同时做这两件事,因为它们之间并没有太大的关系。

如果您想将 VTNVTNVTN...(顶点、纹理、法线)等顶点打包在单个缓冲区中,或者将 VVV、TTT、NNN 打包在单独的缓冲区中,则是否使用交错数组只是一种选择。

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

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

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

我怀疑这就是你最初感到困惑的原因,因为你认为你可以有多个索引。

于 2012-11-14T07:25:22.877 回答