在介绍纹理过滤方式前,先说下纹理。
纹理
纹理就是一块二位的图形,用来表示物体的表面图案,一般称为纹理贴图。纹理映射就是将纹理空间的中纹理像素映射到屏幕空间中的像素的过程。OpenGL中纹理的各种过滤和设置,就是为了控制纹理映射的结果。
纹理映射从两种类型考虑,一种是在光滑平面上添加纹理,添加之后表面保持形状不变,这种过程基本上,用一个映射函数描述即可完成;另一种是表面呈现出凹凸不平的形状,这种过程用扰动函数描述。第一种比较常见些,下面就说下光滑表面剩的纹理映射。
这种相当于从一个坐标系到另一个坐标系的变换,如,在纹理空间的正标坐标系(u,v)中定义一个纹理图案,要贴的表面的正交坐标系表示位(s,t)。通过一个映射函数进行变换:
s=f(u,w)
t=g(u,w)
或者反向变换
s=f(u,w)
t=g(u,w)
来表示,这里的映射函数决定了纹理的效果,最简单的映射函数可以是一个线性函数:
s=Au+B, t=Cw+D
其中A、B、C、D可以通过两个坐标系中已知点求得。
纹理过滤方式
纹理过滤就是给被贴表面上每个像素着色的过程。因为纹理照片和被贴表面的大小不同,两者之间的像素不能一比一的对应,所以引入了不同的纹理过滤方式,不同的过滤方式所呈现出来的贴图效果不同,有的小纹理照片在被映射到大的贴图表面时会出现类似马赛克或模糊的效果。
常见的纹理过滤方式分为两类:线性纹理过滤和各向异性纹理过滤。线性纹理过滤又分成双线性和三线性纹理过滤。
双线性纹理过滤
双线性纹理在进行缩放显示时,将一个像素分成2*2的纹理元素区域快,这个样就拥有四个纹理元素区域了,然后以目标纹理的像素点位中心,对该店附近的4个像素颜色值求平均值,再将这个平局颜色值贴到目标图像素的位置上。
优点:运算量小,比较适合于有一定景深的静态影响
缺点:经过双线性处理后的像素显得有些模糊,不适合非常小的三维物体,不适合移动中的物体,会产生条纹纹理变形等问题,当视角发生变化时,可能有视觉闪烁感。
三线性纹理过滤
三线性纹理过滤以双线性过滤为基础,原理与双线性纹理过滤一样,只不过三线性纹理过滤的采样范围更大。三线性纹理过滤主要在双线性纹理过滤的基础上增加了4个纹理元素作为采样的参考,使用两次双线性纹理过滤,计算8个像素的值。
一般情况下,三线性过滤的效果非常理想,可以比双线性过滤更加有效地解决不同等级纹理过滤时出现的组合、交叉以及重叠现象。但是当物体消失的方向(透视方向)和我们的视角有一定夹角时,三线性过滤任然存在失真。
各向异性纹理过滤
各向异性纹理过滤主要通过增加更多贴图模型,消除z轴旋转表面的锯齿状线条而达到更好的画面效果,融合了双线性纹理过滤和三线性纹理过滤的一些特点。各向异性纹理过滤不同于双线性和三线性过滤,后两者都是各向同性的过滤,在各个放行上矢量值都是一致的,在渲染时各个图元像素的尺寸、形状都是固定的;各向异性过滤正好相反,主要处理适量方向值不一致的数据,在渲染时使用尺寸可变的图元像素。