材质过滤
在计算机图形学中,材质过滤(Texture filtering)是一种针对一个使用材质贴图的像素,使用临近的一个或多个纹素计算其纹理颜色的方法。从数学上来说,材质过滤是抗锯齿的一种,但它更着重于滤掉材质中的高频,而不像其他抗锯齿技术那样着重于改善边界显示效果。简单来说,它使得同一个材质可以被用于不同的形状,尺寸和角度,同时尽可能减少显示时的模糊和闪烁。
用户可以权衡计算复杂度和图像质量,在许多种材质过滤方法中进行选择。
为何需要材质过滤
[编辑]在应用材质贴图时,需要对于每一个像素中心所在的位置进行查询材质值的操作。但是由于被渲染的目标表面相对于视角,可能处于任意距离或者角度,一个像素不一定有一个纹素对应。所以需要应用某种过滤方式来决定其材质值,缺少过滤或使用不当都会造成最终的图像存在例如锯齿和闪烁之类的瑕疵。
由于应用材质贴图的表面相对于视角的距离和角度不同,在表面之上的一个像素和对应的材质之上一个或多个纹素之间可能存在多种对应关系,这也导致需要应用不同的过滤方式。如果把一个正方形的材质映射到一个正方形的表面上,在离视角的某一个距离上,屏幕上的一个像素和一个纹素几乎等尺寸。如果比这个距离近,纹素就会比像素尺寸大,这是就需要将纹素相应地放大,这就是所谓的材质放大。同理,如果比这个距离远,纹素将比像素尺寸小,一个像素最终的材质值就会从其覆盖的多个纹素的值计算出,这也就是通常所说的材质缩小。常见的图像应用程序接口,例如OpenGL,提供了多种的缩小和放大过滤方式。
值得注意的是,即使在像素和纹素尺寸相等的情况下,其之间也不一定就存在一一对应的关系。例如可能存在错位而导致一个像素覆盖了相邻四个纹素的各一部分。所以仍然需要某种过滤方式。
Mipmapping
[编辑]Mipmapping是一种常见的通过预计算减小渲染时所需过滤工作的方法。在材质放大中,所参与计算一个像素的材质值的纹素一般是四个或更少;而在材质缩小中,随着目标表面远离视点,整个材质尺寸可能最终将比一个像素还小,这将造成需要其上的所有纹素进行计算,这样造成的计算量和带宽在实时渲染中是不现实的。Mipmapping通过进行预计算,并将结果存储在一系列更小尺寸的材质中,避免了这种情况的发生。当目标表面逐渐远离时,更小尺寸的材质将自动被选用参与计算。
过滤方式
[编辑]以下列举了常见的材质过滤方式,以计算成本从少到多排序。
最近邻插值
[编辑]最近邻插值是最快速,也是最粗糙的过滤方式。最邻近像素中心的纹素颜色将被作为像素的颜色。在材质放大时,这种方式会导致色块;而在材质缩小时,则会导致闪烁和锯齿。
最近邻Mipmapping
[编辑]这种方式先根据距离选择最近的mipmap层级,再从其中选择最靠近像素中心的纹素。这对闪烁和锯齿很有效,但不能减少色块。
双线性过滤
[编辑]双线性过滤会从最近的mipmap层次上,选择最靠近像素中心的四个纹素,再根据他们靠近像素中心的具体进行权重插值。这时如果进行材质放大,当像素相对于纹素移动时,像素颜色会从逐渐从一个纹素颜色变化到相邻的纹素颜色,而不是像最近邻插值那样,在穿过两个纹素的边界时发生突变,这样就消除色块。双线性过滤经常与mipmapping一起使用,但也可以单独使用,但这时会出现闪烁和锯齿化的问题。
三线性过滤
[编辑]在使用mipmapping双线性过滤时,当目标表面的距离变化时,会从一个mipmap层次突变到相邻的层次。三线性过滤被用来解决这个问题,方法是在最相邻的两个mipmap层次上分别进行双线性过滤,再用得到的两个值进行线性插值。值得注意的是,当距离小于mipmap的零层次时(即纹素大小超过像素大小时),三线性插值退化为双线性插值。
各向异性过滤
[编辑]各向异性过滤是现有消费级显卡所提供的图像质量最佳的过滤方式。传统的各项同性过滤中只是在正方形的mipmap层次间进行双线性或三线性插值,但是当一个目标表面和摄像机之间角度较大时,材质的填充面积并不是正方形,这样便引入了模糊和闪烁等瑕疵。 于是,各向异性过滤需要对一个非方形材质进行采样。在一些简单的实现中,显卡使用长方形的材质取代方形材质,达到了较好的近似效果。但是这种方式在处理边界时效果依然不理想,原因是在倾斜的表面上,近端边界比远端边界拥有更多的像素。于是一些高端显卡使用了梯形材质,当然这也要求更大的运算量。