8.6.2 纹理映射的快速反走样 ��在纹理映射过程中,常常会出现欠采样、产生纹理图像被压缩的现象,导致严重的纹理走样。如图8.28所示,屏幕上的一个像素区域映射到纹理空间是一个带阴影的四边形区域,该四边形区域的颜色的加权平均可以作为这个像素的纹理颜色,这也就是说,纹理映射把这个四边形压缩成了一个像素。但是,假如只把像素的中心点映射到纹理空间中的一个点,并把这个点的颜色取为该像素的纹理颜色,势必会出现严重的走样现象。 ��Williams1983年提出的Mip-mapping是目前应用最为广泛的纹理映射反走样技术之一。Mip来源于拉丁语"multum in parvo"的缩写,意思是"在一块小空间内的许多东西"。目前,不仅许多图形软件(例如:OpenGL),而且很多三维图形硬件也支持Mip-mapping技术。下面我们将对Mip-mapping作详细的介绍。在开始介绍Mip映射算法之前,首先让我们来剖析它的基本思想。 ��在图8.28中,假设纹理图像是单色的,原始纹理图像的分辨率为8×8,我们分别以4×4、2×2和1×1的分辨率对它进行压缩,这样就建起了一个4层的金字塔(第0~第3层,见图8.29)。第0层的分辨率最高,为8×8;第3层的分辨率最低,为1×1。第3层的一个像素的颜色是由第2层的4个像素的颜色的平均得到,得2层的每个像素的颜色也等于第1层相应的4个像素颜色的平均值,同样地,第1层的每个像素的颜色也等于第0层相应的4个像素颜色的平均值。注意,这里的金字塔是相对于图像的分辨率而言的。对于每一层纹理图像,我们仅仅改变了图像的分辨率,并没有改变它的定义域,即它们的参数坐标u和v的变化范围依然是0~1,也就是说: ,因此,每一层纹理图像在uv坐标系中的整体面积都等于1。但是对于不同的层来说,由于分辨率不一样,像素的个数也不一样,因此,一个像素在uv坐标系中的面积因层而异。一般地,有: ��第i层的每个像素的面积=纹理图像的总面积/第i层的像素总数。 ��比如,图8.29中第3层的一个像素的面积都等于1,第2层的每个像素的面积均为1/4。依此类推,第0层的每个像素的面积都等于1/64。 ��在对纹理图像进行上述金字塔预处理之后,便可以开始进行纹理映射过程。从视点出发经过每个像素的四个顶点的光线到达景物表面后产生反射,反射光束再与二维纹理图像相交(见图8.28),相交区域的面积用Auv表示。如果相交部分正好是整个纹理图像所在的区域,即Auv=1,则该屏幕像素的颜色可以取为金字塔顶层的1个像素的颜色,因为金字塔顶层的这个像素的面积也等于1,而且它的颜色等于初始纹理图像(第0层)的所有颜色的加权平均;如果反射光束与二维纹理图像相交区域的面积Auv=1/16,相交区域中心的纹理坐标为(u,v),如图8.28所示,则我们可以在金字塔的第1层(见图8.29)中根据(u,v)的值找到其中的一个像素(称为金字塔像素),用它的颜色作为该屏幕像素的颜色,因为这个金字塔像素的面积也等于1/16,并且它的颜色是由初始纹理图像(第0层)中以(u,v)为中心、同等面积的区域内所有纹理颜色的加权平均得到的。如果金字塔的第1层中没有任何一个像素中心的纹理坐标等于(u,v),则可以用(u,v)附近的4个金字塔像素的颜色进行线性插值。如果1/16 < Auv < 1/4,则我们可以再通过第1层和第2层的线性插值来得到屏幕像素的颜色值。所以,有时Mip映射也被称为三线性插值。 ��从这个例子可以看出,Mip映射的基本思想是:预先将纹理图像以不同的分辨率压缩成为一个金字塔,并用纹理数组作为纹理查找表保存起来,然后以适当大小的正方形来近似表示每个屏幕像素区域映射到纹理平面中的纹理图像区域,并根据此正方形从金字塔数组中查表(或三线性插值)得到屏幕像素的纹理颜色。 |