Texture Filtering
在讨论纹理坐标和采样时,你可能已经注意到了,没有一种纹理映射object能够做到使纹理图上的元素与渲染到屏幕上的像素之间一一对应。Camera位于textured object任意的位置,并从任意的角度观看。想像下这种情形,camera相对textured object进行放大,Rasterizer阶段确定哪些pixels会发送到pixel shader中,并对纹理坐标进行插值计算,此时纹理坐标表示的位置在纹理中的元素之间。换句话说,就是以比纹理图片本身分辨率更高的方式来渲染纹理。Texture filtering的目的就是确定哪些颜色值会被用于pixels中,因为这些pixels无法在纹理中直接一一对应的找到。
Magnification
上面所描述的情形就是magnification,在这种情况下,需要渲染的pixels比纹理图中包含的元素要多。Direct3D支持三种filtering用于确定这些pixels的颜色值:point filtering,linear interpolation,以及anisotropic filtering(点滤波,线性插值,和各向异性滤波)。
Point Filtering
Point filtering是计算速度最快的filtering选项,但图片的质量也是最低的。Point filtering也称为nearest-neighbor(邻近取样) filtering,只是简单的使用纹理中与pixel中心最接近的坐标颜色值。如图5.5,左图中显示了使用point filtering产生的blocky-looking(块状)图片。
图5.5 The results of point filtering (left) and bilinear interpolation (right) on a magnified texture.
(Texture by Reto Stckli, NASA Earth Observatory.)
Linear Interpolation
Linear Interpolation是一种比point filtering质量更高的filtering选项,在linear interpolation中颜色值是通过相邻的两个纹理元素插值计算出来的。对于2D textures,更准确的说应该叫bilinear interpolation(双线性插值),因为要在水平和垂直两个方向都进行插值。使用双线性插值,首先要确定围绕pixel中心的四个纹理元素,再沿着U轴执行两次一维的线性插值,然后沿着V轴执行第三次插值,就可以产生最终的颜色值。图5.5中,右边的图片是在相同的放大纹理中使用双线性插值的结果,可以明显的看出比point filtering更平滑。
Anisotropic Filtering
Anistropy是指,在一个相对camera处于倾斜角度的表面上,投影一个纹理产生的变形程度。Anistropic filtering(各向异性滤波)就是用于减小这种变形程序,并改善渲染的输出结果。这是一种计算成本最大的filtering选项,但是产生的结果却是质量最好的。图5.6展示了使用和不使用anisotropic filtering进行纹理映射的对比效果。
图 5.6 A mapped texture with bilinear filtering (top) and anisotropic filtering (bottom).