.obj文件中顶点数据的合并

来源:互联网 发布:java数组赋值未满 长度 编辑:程序博客网 时间:2024/05/22 06:41

在OpenGL中,为了减少顶点数据所占用的内存,通常会合并具有相同属性的顶点,然后使用顶点的索引进行绘制。

举例来说,对于xz平面上中心在原点的的单位正方形,需要两个三角形来表示它,于是一共需要六个顶点:

// 第一个三角形v1: 位置(-0.5,  0.0,  0.5),纹理坐标(0.0, 0.0),法向量(0.0, 1.0, 0.0)v2: 位置( 0.5,  0.0,  0.5),纹理坐标(1.0, 0.0),法向量(0.0, 1.0, 0.0)v3: 位置( 0.5,  0.0, -0.5),纹理坐标(1.0, 1.0),法向量(0.0, 1.0, 0.0)// 第二个三角形v4: 位置(-0.5,  0.0,  0.5),纹理坐标(0.0, 0.0),法向量(0.0, 1.0, 0.0)v5: 位置( 0.5,  0.0, -0.5),纹理坐标(1.0, 1.0),法向量(0.0, 1.0, 0.0)v6: 位置(-0.5,  0.0, -0.5),纹理坐标(0.0, 1.0),法向量(0.0, 1.0, 0.0)

可以看到,v1v4的属性是完全一样的,v3v5的属性是完全一样的,于是它们可以进行合并,合并后顶点的个数变为4:

v1: 位置(-0.5,  0.0,  0.5),纹理坐标(0.0, 0.0),法向量(0.0, 1.0, 0.0)v2: 位置( 0.5,  0.0,  0.5),纹理坐标(1.0, 0.0),法向量(0.0, 1.0, 0.0)v3: 位置( 0.5,  0.0, -0.5),纹理坐标(1.0, 1.0),法向量(0.0, 1.0, 0.0)v4: 位置(-0.5,  0.0, -0.5),纹理坐标(0.0, 1.0),法向量(0.0, 1.0, 0.0)

此时可以使用索引的形式来表示两个三角形:

// 第一个三角形0 1 2// 第二个三角形0 2 3

仔细观察可以发现,这四个顶点的法向量是完全一样的。那么,如果我们将顶点的三个属性(位置、法向量和纹理坐标)分开存储,则四个法向量同样可以合并成一个,这样需要存储的内容就可以进一步缩减。.obj文件正是这样做的。

在.obj文件中,顶点的三个属性分开存储,每种属性中一致的属性合并为一个,然后使用三个对应属性的索引来表示一个顶点。

依然拿上面的例子进行举例。6个顶点的位置属性可以合并为4个,用v来表示,则有:

v -0.5000  0.0000  0.5000v  0.5000  0.0000  0.5000v  0.5000  0.0000 -0.5000v -0.5000  0.0000 -0.5000

6个顶点的纹理坐标可以合并为4个,用vt来表示,则有:

vt 0.0000 0.0000vt 1.0000 0.0000vt 1.0000 1.0000vt 0.0000 1.0000

6个顶点的法向量可以合并为1个,用vn来表示,则有:

vn 0.0000 1.0000 0.0000

然后使用属性的索引来表示顶点并组成三角形,用f来表示,则有(注意:在.obj中,索引的起始值为1):

f 1/1/1 2/2/1 3/3/1f 1/1/1 3/3/1 4/4/1
0 0