纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。
一张纹理是由一系列的像素组成的(所以叫做texel,翻译为“纹理像素”或“纹理元素”),每个像素基于纹理的宽和高对应一个纹理坐标。这些纹理坐标沿着uv坐标(u为宽,v为高)被映射到[0,1]范围内。这个过程叫做UV映射,坐标被称为UV坐标。
当你绘制一个多边形时,会计算三角形中每个顶点的UV坐标。这三个UV坐标决定在pixal shader中如何将一张纹理应用到多边形上。当u或v值小于0或大于1时,会根据设置的纹理寻址模式(texture address mode)决定应用的方式。当设置为TextureAddressMode.Border时,任何UV映射超出[0,1]范围的像素的颜色会被设置成纹理边界的颜色。当设置成 TextureAddressMode.Clamp时,会使用最近像素的颜色。设置为TextureAddressMode.Wrap 表示重复纹理。当设置为TextureAddressMode.Mirror时,纹理会重复,但在UV边界上会反向。每根轴的纹理寻址模式可以不同,所以你可以在u轴上设置wrap同时在v轴上设置clamp。
如果对于多边形来说纹理太大或太小,那么纹理需要被过滤以匹配空间。有两种过滤方式:放大和缩小。放大过滤器将纹理放大,缩小过滤器将纹理缩小。纹理放大通常很简单,会获得一张模糊的图像,而纹理缩小比较复杂,不正确的缩小会导致锯齿。
最常用的缩小方法是为每个纹理创建一个mipmap。mipmap是一张预先缩小的纹理,尺寸通常是原始纹理大小的一半。对这个mipmap再进行mipmap操作,最终创建一个大小为1x1的纹理,这就是纹理的最终mipmap。你可以将mipmap想象成一个链表,从原始纹理开始,然后变得越来越小,直