在图形渲染管线最前面,是模型数据,也称为网格(Mesh)。网格是多边形列表,在图形学中,网格多采用三角形列表,也就是说,网格实质上是由若干三角形组合而成。
如何让若干三角形正确表示一个模型呢?那么必不可少的必定是顶点。三角形由3个顶点构成。如果只是简单地列出这些顶点或这些三角形,不足以正确描述此模型。那么还缺的是如何互相组合顶点。网格的三角形,必定会有很多是共用顶点、共用边的,只存储三角形列表,会浪费许多空间。所以在图形学中,往往使用两个数组:顶点表和索引表,相互协作来达到描述网格三角形组的目的。
既然有索引表,那么肯定存在顺序问题。如果要表示同一个模型,顶点表中顶点存放的顺序发生了改变,那么索引表中的数据肯定会发生改变,所幸这种琐碎的事情常常由3D建模工具完成。当然,如果是2D模型又如何?2D模型往往三角形面少,易于管理,即使是手动管理也是可行的,但3D模型非常复杂, 手动管理模型数据简直是吃力不讨好。
网格模型的三角形索引顺序主要有:上下,逆顺时针。通常的顺序(以底部视图)是从下向上,顺时针索引。
理解了3D模型网格的组成原理,那么可以设计自动生成模型的工具。
三角形列表,实质上还存在隐藏的图元(Primitive)属性。就如同房子一样,只有钢筋骨架和有钢筋骨架带玻璃,那是不一样的。如果顶点表和索引表采用点图元,那么模型则仅是散列点云而已;如果采用线图元,那么顶点会两两结合成线,那么模型则是散列线云;如果采用线带,则是线框等。也会有其他图元如Quad,Polygon,Fan等,不同的图元属性,会构成不同的模型表面。
纹理贴图
除了模型表面之外,我们还需要给模型外观。最常见的是不同的三角形有不同的颜色,所以在顶点中,可以附加颜色信息,来决定组成的三角形的颜色。这是最常见的,但通常有从图片(纹理)直接获取颜色细节的操作。这就像是给表面涂上颜色,顶点附加颜色信息,那是涂纯色;顶点附加纹理坐标,这是贴图。这2种操作都称为贴图,纯色是特殊的纹理。
这里纹理、图片是同种概念,都指代颜色/像素矩阵,但图片通常具压缩信息,纹理是感官上的概念
对于贴图,就像有一张图,要将其贴到表面上。在开始讲述贴图的详细过程时,我们先引入一个专有术语:纹素(Texel),从纹理获取的像素。需要和像素做一下区分,像素是三角形面光栅化后生成的填充单元。以下所说的纹素和像素是有区别的。
贴图时,会遇到这样几种情况:
- 图太小,表面太大:
- 如果是单图满贴,那么图势必会拉伸,也意味着一个纹素颜色应用至多个像素;
- 如果多图满贴,则有几种方式:
- 将多份小图平铺,填满表面。平铺也有讲究:
- 线性平铺:复制原图依次平铺,无缝拼贴
- 镜像平铺:纹理会镜像后平铺
- 按小图的边应用颜色:超出部分,全黑/白;或者,根据边的颜色,应用至超出部分
- 将多份小图平铺,填满表面。平铺也有讲究:
- 图太大,表面太小:
- 图会缩小以适应,那么多个纹素的颜色,会应用至一个像素。通常在内部会应用混合算法,将多个纹素颜色混合。这会造成颜色模糊。