顶点数据组织-VBO-Single Buffer

对于一个三角形,可以将其不同属性(attribute)组织成不同的数组内存空间(float*),让其更解耦
每个不同的内存空间,称之为: VertexBufferObject(VBO)

图-1

顶点数据组织-VBO-Interleaved Buffer

对于一个三角形,也可将不同属性组织成一个数组内存空间(float*)

图-2

本数组也可称为一个VBO,被送入管线进行渲染
此种数据排布方式,称为交叉数据缓存(Interleaved buffer)

顶点数据组织-VBO-描述

GPU获取VBO时,可以是以上两种组织方式:

对于第一种组织方式,single buffer,需要知道每个属性由几个float构成(如: 属性position为3个,uv为两个)

对于第二种组织方式,interleave buffer,需要知道:
1、每个顶点属性读取的开始位置
2、某个顶点属性相对于开始位置偏移多少进行读取

顶点数据组织-VBO-描述-Interleaved Buffer

每个顶点数据长度为:8*sizeof(float)=32bytes -> 每个顶点之间步长 Stride = 32

图-3

uv属性相对于每个顶点属性数据内部偏移:3*sizeof(float)+3*sizeof(float) = 24bytes -> 内部偏移 offset=24

图-4

最终可以通过: p+stride*index+offset 读取到 itemSize个float

顶点数据组织-VBO-描述-Single Buffer

每个顶点数据长度为: 3*sizeof(float) = 12bytes -> Stride=12

图-5

Position属性相对于每个顶点数据内部偏移: 0*sizeof(float)=0 bytes -> offset=0

图-6

position由3个float类型数据构成,即itemSize=3
可以通过: p+stride*index+offset 读取itemSize个float

顶点数据组织-VBO管理

每个VBO都会有自己的ID号,设计一个map结构,用于存储程序中分配出来的VBO及ID的键值对

当读取第i个顶点的某个属性时需要知道:
vboID、stride、offset、itemSize

图-7