什么是纹理过滤
缩小或放大纹理时,一个像素会被放到几个像素的位置,或者几个像素放到一个位置,怎样去融合就是texture filtering,即纹理像素(texel)影射到纹理坐标的方式。
OpenGL中如何设置
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
第一个参数:指定纹理目标,2D纹理GL_TEXTURE_2D,立方体贴图GL_TEXTURE_CUBE_MAP;
第二个参数:指定是放大还是缩小纹理时的过滤方式,放大即magnify,缩小即minify,取缩写:
- GL_TEXTURE_MAG_FILTER
- GL_TEXTURE_MIN_FILTER
第三个参数:指定过滤方式:
- 邻近过滤(取最接近纹理坐标点的那一个纹理像素),为默认设置:GL_NEAREST
- 线性过滤(插值计算混合色):GL_LINEAR
以下四个过滤选项仅对缩小设置,因为多级渐远纹理主要使用在纹理被缩小的情况下的,纹理放大不会使用多级渐远纹理,为放大过滤设置多级渐远纹理的选项会产生一个GL_INVALID_ENUM错误代码:
GL_NEAREST_MIPMAP_NEAREST // 邻近多级渐远纹理,邻近采样
GL_LINEAR_MIPMAP_NEAREST // 邻近多级渐远纹理,线性插值采样
GL_NEAREST_MIPMAP_LINEAR // 线性插值两个多级渐远纹理,邻近采样
GL_LINEAR_MIPMAP_LINEAR // 线性插值两个多级渐远纹理,线性插值采样
多级渐远纹理
产生原因:远近物体如果使用相同分辨率贴图,由于远处物体小,只产生很少的片段,OpenGL从高分辨率纹理中为这些片段获取正确的颜色值就很困难,因为它需要对一个跨过纹理很大部分的片段只取一个纹理颜色,在小物体上会产生不真实的感觉,同时,对这些小物体使用高分辨率纹理也存在浪费内存的问题。
如何解决:mipmap是一系列纹理图像,后一个纹理是前一个的1/2,观察者的距离超过一定阈值,OpenGL就会使用不同的多级渐远纹理,即最适合物体的距离的那个,从而提高性能。