一般的贴图又称纹理贴图,是早期渲染工程师为了处理顶点渲染以及差值渲染所引起 的视觉误差而使用的位图影像。
纹理通常含有颜色信息,并且一般会投射在网格的三角形上,这种使用纹理的方法就好像我们小时候把假纹身印在手臂上一样。但其实纹理也可以存储颜色以外的视觉信息。而且纹理也不一定用于投射网格上。
纹理中每个单独的像素称为纹素,以区别屏幕上的像素。
纹理的种类##
漫反射贴图(Diffuse map)
漫反射贴图的纹素存储了表面的漫反射颜色,这好比是在表面上贴上贴纸或涂上油漆。法线贴图(Normal map)
每个纹素用来存储以RGB值编码后的法矢量。光泽贴图(Gloss map)
每个纹素上描述了表面的光泽程度。环境贴图(Environment map)
含周围环境的图像以渲染反射效果。
UV
如何将二维的纹理投射到网格上。首先,我们要定义一个称为纹理空间(texture space)的二维坐标系。纹理坐标通常以两个归一化的数值(u,v)表示,这些坐标的范围是从纹理的左下角(0,0)伸展至右上角(1,1)。使用归一化纹理坐标的好处是这些坐标不会受纹理尺寸的影响。
纹理寻址模式(texture addressing mode)
纹理坐标可以延伸至[0,1]范围之外,图形硬件可以以以下几种方式处理范围以外的纹理坐标,这些处理方式被称为纹理寻址模式。
- 缠绕模式(wrap mode)
此模式中,纹理在各方向重复又重复。所有形式为(ju,kv)的纹理坐标等价于(u,v),k和j是任何整数。 - 镜像模式(mirror mode)
此模式和缠绕模式相似,不同的是在u为奇数倍上的纹理会在v轴方向形成镜像,同时v奇数倍上的纹理会在u轴方向形成镜像。 - 截取模式(clamp mode)
当纹理在正常的坐标之外,纹理的边缘纹素会简单地延伸。 - 边缘颜色模式(border color mode)
此模式下,用户可以指定一个颜色,当纹理坐标在[0,1]之外使用。
纹素密度(textel density)
纹素密度是纹素与像素的比。
纹素密度会随着物体相对摄像机的距离而改变。纹素密度影响内存的使用量,也会影响三维场景的视觉品质。
当纹素密度小于1,每个纹素就会明显的比屏幕像素大,那么就会察觉到纹素的边缘,这会影响游戏的真实感。当纹素密度远大于1,许多纹素会影响单个屏幕像素,这样会产生莫列波纹。更甚者由于像素边缘内的多个像素会按细微的摄像机移动而不断改变像素的颜色,像素的颜色就会显得浮动不定和闪烁。
而且,若玩家不会接近一些远距离的物体,用非常高的纹素密度渲染那些物体只会浪费内存。
多级渐远纹理(mipmapping)
理想状况下,我们希望无论物体时远近,都能维持纹素密度接近于1,但是要准确的维持约束是不可能的,所以我们采用多级渐远纹理技术来逼近。
其方法是,对于每张纹理,我们建立较低分辨率位图的序列,其中每张位图的宽度和高度都是前一张的一半,我们称这些影像为多级渐远纹理(mipmap)
世界空间纹理密度
纹理过滤(texture filtering)
当渲染纹理三角形上的像素时,图形硬件会计算像素中心落入纹理空间的位置,对纹理贴图采样。通常纹素和像素之间没有一对一的映射,像素中心可以落入纹理空间的任何位置,包括两个或两个以上纹素之间的边缘。因此,图形硬件通常需要采样出多于一个纹素,并把采样结果混合以得出实际的采样纹素颜色,这一过程称为纹理过滤。
- 最邻近(nearest neighbor)
这种粗糙的方法会挑选最邻近像素中心的纹素。当使用多级渐远纹理时,这种方法会挑选一个渐远纹理级数,该级数最接近但高于理想的分辨率。理想分辨率是指达到屏幕空间纹素密度为1。该采样模式速度最快,但是效果最差,是DX9默认的采样模式。 - 双线性(bilinear)
此方法会围绕着像素中心的4个纹素采样,并计算该4个颜色的加权平均值(权重是基于纹素和像素中心的距离),当使用多级渐远纹理时,也是选择最近接的级数。 - 三线性(trilinear)
此方法把双线性过滤法施予最接近的两个渐远级纹理级数(一个高于理想分辨率,一个地狱理想分辨率),然后把两个采样结果线性差值。这样便能消除屏幕上碍眼的,相邻渐远纹理级数之间的边界。线性和双线性过滤以目前的硬件来说效果相对较好,速度也不会太慢,但不建议过多使用。 - 各项异性(anisotropic)
双向性和三线性都是对2的幂次方的纹素块采样。如果纹理表面是刚好面对着摄像机的,这样是正确的做法。然而,若表面倾斜于虚拟屏幕。这就不太正确了。各向异性过滤会根据视角,对一个梯形范围内的纹理采样,借以提高非正对屏幕的纹理表面视觉品质。这种类型的过滤效果最好,也是最慢的。
这里可以看移动GPU对纹理压缩相关原理