OpenGL 交错索引数组

标签 opengl optimization 3d vbo

我正在用 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/

相关文章:

c++ - 如何在 OpenGL 3.3 中渲染多个对象,每个对象可以有多个着色器?

C++ Opengl,Win内存泄漏

OpenGL 色彩空间转换

optimization - 将小数加载到 64 位 x86 寄存器中

optimization - 优化零乘法

algorithm - 对公式已知的表面进行光线追踪的最有效方法是什么?

c++ - 获取3d空间中声音的 "pan"

opengl - OpenGL 是 API 还是软件库?

java - 生成棋盘图案的紧凑方法

python - 使用 python 将 3D 网格渲染成图像