什么是纹理映射(Texture Mapping)
纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。
一张纹理是由一系列的像素组成的(所以叫做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想象成一个链表,从原始纹理开始,然后变得越来越小,直到变为一个纹理像素。当需要缩小时,首先选择适当大小的mipmap纹理,然后将这个纹理施加到对象上,如果需要还要进行实时纹理过滤。内容管道中的默认纹理处理器有一个自动生成mipmap的选项。
XNA支持5种过滤器。TextureFilter.Point(点过滤)使用纹理上的最近点,没有过滤。TextureFilter.Linear(线性过滤)对邻近的4个纹理像素的采样进行线性插值并生成一个平均值。TextureFilter.PyramidalQuad也使用4个采样点,这些采样点用的是靠近结果像素中心的纹理像素计算出最终结果。TextureFilter.GaussianQuad工作方式相同,但使用了不同的算法权重- 类似于一个钟型曲线,此曲线的顶部就是结果像素的中心。TextureFilter.Anisotropic(各向异性过滤)被设计用来过滤那些不是面对相机的表面(例如靠近水平面的地面)。
发布时间:2009/6/29 上午8:19:59 阅读次数:14662