目前,在我的渲染引擎中,每个网格数据都有一个VBO(1个VBO用于存储顶点,1个VBO用于存储法线,1个VBO用于存储纹理坐标,1个VBO用于存储切线和1个VBO用于存储副切线),并且它们都与VAO一起绑定。 我现在正在考虑将系统更改为持有包含所有网格数据(顶点,法线等)的单个VBO,但我会从中获得多少利益呢?就速度和效用而言(因为如果我的网格没有纹理,则可能没有所有数据并仅提供顶点和法线)。
您将寻求降低总内存带宽。如果您的缓冲对象包含所有属性相互交织在一起,那么您的整个数组对象仅引用单个连续的内存部分。这对于内存子系统来说更容易缓存。这与 CPU 完全相同的原理——本地连续访问内存越多,速度就越快。还有一个潜在的劣势:一般规则是,您应将元素与元素大小和四个字节中较大的对齐。这会导致一些浪费的空间,但好处几乎总是超过劣势。显然,唯一受影响的是 GPU 获取顶点所需的时间。如果您是镶嵌或填充受限,则不会立即看到任何改进。