OpenGL 单个 VBO 与多个 VBO

zeb*_*zeb 5 c++ opengl rendering

目前,在我的渲染引擎中,我为每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 个 VBO 用于法线,1 个 VBO 用于纹理坐标,1 个 VBO 用于切线,1 个 VBO 用于双切线),并且所有这些都与一个VAO。

我现在正在考虑更改系统以保存包含所有网格数据(顶点、法线等)的单个 VBO,但是我将从中获得多少收益?谈论速度和实用性(因为如果我的网格没有纹理,我可能没有所有数据并且仅提供顶点和法线)。

Tom*_*mmy 2

您将寻求减少总体内存带宽。如果您的缓冲区对象包含交错在一起的所有属性,那么这意味着您的整个数组对象仅引用一个连续的内存部分。这对于内存子系统来说更容易缓存。这与 CPU \xe2\x80\x94 的原理完全相同,本地连续内存访问越多,速度就越快。

\n\n

还有一个潜在的缺点:一般规则是您应该将元素对齐到元素大小和四个字节中较大的一个。这导致了一些空间的浪费。但好处几乎总是大于坏处。

\n\n

显然,唯一受影响的是 GPU 获取顶点所需的时间。如果您进行镶嵌或填充绑定,您将不会立即看到任何改进。

\n