【发布时间】:2023-04-07 19:23:02
【问题描述】:
目前,在我的渲染引擎中,每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 VBO 用于法线,1 VBO 用于纹理坐标,1 VBO 用于切线,1 VBO 用于双切线),它们都是与 VAO 绑定在一起。
我现在正在考虑更改系统以保存包含所有网格数据(顶点、法线等)的单个 VBO,但我将从中获得多少收益?谈到速度和实用性(因为如果我的网格没有纹理,我可能没有所有数据并且只提供顶点和法线)。
【问题讨论】:
目前,在我的渲染引擎中,每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 VBO 用于法线,1 VBO 用于纹理坐标,1 VBO 用于切线,1 VBO 用于双切线),它们都是与 VAO 绑定在一起。
我现在正在考虑更改系统以保存包含所有网格数据(顶点、法线等)的单个 VBO,但我将从中获得多少收益?谈到速度和实用性(因为如果我的网格没有纹理,我可能没有所有数据并且只提供顶点和法线)。
【问题讨论】:
您将寻求减少整体内存带宽。如果您的缓冲区对象包含交错在一起的所有属性,那么这意味着您的整个数组对象仅引用一个连续的内存部分。这对于内存子系统来说更容易缓存。这与 CPU 的原理完全相同——本地连续内存访问越多,它们可能越快。
还有一个潜在的不利因素:一般规则是您应该将元素对齐到元素大小和四个字节中的较大者。这会导致一些空间浪费。但几乎总是利大于弊。
显然,唯一会受到影响的是 GPU 获取顶点所需的时间。如果您是曲面细分或填充边界,您不会立即看到任何改进。
【讨论】: