三维模型的表示
三维模型的网格由一组顶点和一组索引组成:
- 顶点: 组成网格的点, 包括坐标/颜色/法向量/纹理坐标等信息.
- 索引: 说明了哪些顶点构成一个面. 假设图元为三角形, 那么索引就是三个数字一组.
这两部分数据从模型文件中读取出来, 并存放在顶点缓冲区(vertex buffer)和索引缓冲区(index buffer). 这两个缓冲区的数据将被提交给渲染器用于绘制图像.
顶点缓冲区的数据布局可以自定义, 所以在这之前还需要告知 GPU 如何解析顶点缓冲区中的数据.
用于描述数据布局的信息称为顶点属性, 能声明的顶点属性是有上限的, 一般由硬件决定. 这部分数据将在绘制时提交给着色器处理.
OBJ 文件格式
了解 OBJ 文件格式有利于理解 3D 模型的表示方式.
每行由关键字和数据组成.
关键字主要有:
- v: 顶点坐标, 数据为三个浮点数, 分别表示 x, y, z 坐标.
- vn: 顶点法向量, 数据为三个浮点数, 表示法向量.
- vt: 顶点材质坐标, 数据为两个浮点数, 表示材质的 U, V 坐标.
-
f: 面
数据格式为
顶点索引/顶点材质坐标索引/顶点法向量索引
重复三组, 分别表示组成三角形的三个顶点.
顶点材质坐标索引和顶点法向量索引可以为空.
索引从 1 开始, 可以为负数, 比如 -1 表示最后一个元素.
三角形:
o triangle
v 0.0 0.5 0.0 # 顶点 1, 坐标为 ( 0, 0.5, 0), 位于中上方
v -0.5 -0.5 0.0 # 顶点 2, 坐标为 (-0.5, 0.5, 0), 位于左下方
v 0.5 -0.5 0.0 # 顶点 3, 坐标为 (0.5, -0.5, 0), 位于右下方
f 1 2 3 # 顶点 1, 2, 3 连线, 构成一个三角形的面
立方体:
o cube
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
vn 0.0 0.0 1.0
vn 0.0 0.0 -1.0
vn 0.0 1.0 0.0
vn 0.0 -1.0 0.0
vn 1.0 0.0 0.0
vn -1.0 0.0 0.0
f 1//2 7//2 5//2
f 1//2 3//2 7//2
f 1//6 4//6 3//6
f 1//6 2//6 4//6
f 3//3 8//3 7//3
f 3//3 4//3 8//3
f 5//5 7//5 8//5
f 5//5 8//5 6//5
f 1//4 5//4 6//4
f 1//4 6//4 2//4
f 2//1 6//1 8//1
f 2//1 8//1 4//1
可以将上方数据保存为 obj 文件并使用 3D 查看器查看.
可以看出, 在指定面的构成时, 每个顶点被赋予了一个法向量, 也间接的为每个面指定了三个法向量.
在绘制面的过程中, 可以通过对三个法向量进行插值来获得当前像素的法向量, 绘制出平滑的曲面.
详情请参考法向量.