(资料图片仅供参考)
当纹理被映射到过大过较小的表面时,可能会出现一些问题,例如锯齿状边缘、马赛克效应或者模糊。纹理过滤就是用来解决这些问题的。纹理过滤的目标是在纹理被映射到不同大小的表面时,保持图像的质量和细节。
最常见的纹理过滤技术包括邻近采样(Nearest Neighbor Filtering)和线性过滤(Linear Filtering)。
邻近采样是OpenGL默认的纹理过滤方式——GL_NEAREST。在这种方式下,OpenGL会选择中心点最接近纹理坐标的那个像素。
线性过滤——GL_LINEAR,它会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。一个纹理像素的中心距离纹理坐标越近,那么这个纹理像素的颜色在最终颜色中的所占的权重越大。
在进行放大(Magnify)和缩小(Minify)操作的时候可以设置纹理过滤的选项,比如在纹理被缩小的时候使用邻近采样,被放大时使用线性过滤。和设置纹理环绕方式一样,我们调用函数glTexParameteri()设置纹理过滤方式。
纹理被应用到远处的物体上时,由于透视效果,远处的像素变得很小,导致图像细节丢失,甚至出现锯齿状边缘。多级渐远纹理(Mipmap)就是用来解决这个问题的。它简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一。当渲染远处的物体时,多级渐远纹理技术可以根据物体与相机之间的距离选择适当的mipmap级别,以保证图像不失真,同时提高渲染性能,因为较远的物体可以使用较低分辨率的纹理,减少了处理和存储的工作量。
函数glGenerateMipmap()会为当前绑定的纹理自动生成所有需要的多级渐远纹理。
此外,为了指定不同多级渐远纹理级别之间的过滤方式,可以使用mipmap模式代替原有的纹理过滤方式,例如:
一般将缩小过滤的选项设置为多级渐远纹理过滤。因为多级渐远纹理主要是使用在纹理被缩小的情况下的,纹理放大不使用多级渐远纹理。