《3D数学基础》—— 10.5 纹理映射
概念介绍
纹理贴图(Texture Map)
简单来讲就是“粘贴”到对象表面的位图图像,是应用于模型表面的常规位图。
纹理元素(Texel)
纹理元素是指纹理贴图中的单个像素,可以将Texel理解为Texture Pixel的简称,有时简称为“纹素”。它和体素(Voxel)的构词法类似,后者为体积元素(Volume Pixel)的简称。计算机图形学的上下文中会谈及很多不同类型的位图,该术语就是通过一种简洁的方式区分帧缓冲区中的像素(Pixel)和纹理中的像素(Texel)。
工作原理
有许多种不同的方法可以将纹理贴图应用到网格上,如平面映射(Planar Mapping)可以将纹理按正交方式投影到网格上,除此之外还有,球体映射(Spherical Mapping)、圆柱形映射(Cylindrical Mapping)和立方体映射(Cubic Mapping)等类型。
纹理映射的 关键要点 是,在网格表面上的每个点处,可以获得纹理映射坐标(Texture-Mapping Coordinate),其定义了纹理贴图中与网格三维位置对应的二维位置。
传统上,纹理映射坐标分配了变量(u, v),其中u为水平坐标,v为垂直坐标。因此,纹理坐标通常称为UV坐标(UV Coordinate)或者简称为UV。虽然位图有不同大小,但是UV坐标会被归一化。
通常情况下,只在顶点级别计算或指定UV坐标,并通过插值获得某个面的任意内部位置的UV坐标。有一个很形象的比喻:
可以将纹理贴图想象成一块弹力布,当将纹理贴图坐标指定给一个顶点时,就好像使用一根大头针将该弹力布固定在那些UV坐标上,以便通过这种方式将布钉在该顶点的表面上。对于每个顶点都有一根大头针,因此整个表面都会被覆盖贴图。
样例
同一张纹理贴图和同一个网格,分配给顶点的UV值不同时,效果也是不一样的,如下图:
除此之外,UV坐标值允许在[0,1] 范围之外,可以有多种方式解释。
最常见的处理方式是 重复(Repeat) —— 也称为 平铺(Tile) ,其会丢弃坐标的整数部分,仅使用小数部分,结果就是使纹理重复。
另外还有一种方式是 锁住(Clamp), 当使用[0,1]范围之外的坐标访问位图时,它会被锁在[0,1]范围内,结果就是对于超出范围的区域复制位图边缘像素。
当然还有其他方式,某些硬件可能还支持 镜像(Mirror) 等选项,镜像类似于重复,区别在于每一个其他平铺的块都是镜像的,可以保证相邻的平铺块之间不存在“接缝”,而是一个连续的图像。