材质过滤知识:http://baike.baidu.com/view/49989.htm
简介
当材质被贴到屏幕所显示的一个3D模型上时,材质处理器必须决定哪个图素要贴在哪个像素的位置。 由于材质是2D图片,而模型是3D物件,所以通常图素的范围与像素范围不会是恰好相同的。此时要解决这个像素的贴图问题,就得用插补处理的方式来解决。而 这种处理的方式共分三种:“近邻取样”、“双线过滤”、“三线过滤”以及“各向异性过滤”。
近邻取样
1.Nearest Neighbor (近邻取样) 又被称为Point sampling(点取样),是一种较简单材质影像插补的处理方式。会使用包含像素最多部分的图素来贴图。换句话说就是哪一个图素占到最多的像素,就用那个图素来贴图。这种处理方式因为速度比较快,常被用于早期3D游戏开发,不过材质的品质较差。
双线过滤
2.Bilinear Interpolation (双线过滤) 这是一种较好的材质影像插补的处理方式,会先找出最接近像素的四个图素,然后在它们之间作差补 效果,最后产生的结果才会被贴到像素的位置上,这样不会看到“马赛克”现象。这种处理方式较适用于有一定景深的静态影像,不过无法提供最佳品质。其最大问 题在于,当三维物体变得非常小时,一种被称为Depth Aliasing artifacts(深度赝样锯齿),也不适用于移动中的物件。
三线过滤
3.Trilinear Interpolation (三线过滤) 这是一种更复杂材质影像插补处理方式,会用到相当多的材质影像,而每张的大小恰好会是另一张的 四分之一。例如有一张材质影像是512×512个图素,第二张就会是256×256个图素,第三张就会是128×128个图素等等,总之最小的一张是 1×1。凭借这些多重解析度的材质影像,当遇到景深极大的场景时(如飞行模拟),就能提供高品质的贴图效果。一个“双线过滤”需要三次混合,而“三线过 滤”就得作七次混合处理,所以每个像素就需要多用21/3倍以上的计算时间。还需要两倍大的存储器时钟带宽。但是“三线过滤”可以提供最高的贴图品质,会 去除材质的“闪烁”效果。对于需要动态物体或景深很大的场景应用方面而言,只有“三线过滤”才能提供可接受的材质品质。
各向异性过滤
4.Anisotropic Interpolation (各向异性过滤) 它在取样时候,会取8个甚至更多的像素来加以处理,所得到的质量最好。 2-sided (双面) 在进行着色渲染时,由于物体一般都是部分面向摄像机的,因此为了加快渲染速度,计算时常忽略物体内部的细节。当然这对于实体来说,不影响最终的渲染结果; 但是,如果该物体时透明时,缺陷就会暴露无遗,所以选择计算双面后,程序自动把物体法线相反的面(即物体内部)也进行计算,最终得到完整的图象。
Ogre中的应用:
//各向异性过滤
Ogre::TextureFilterOptions tfo = Ogre::TFO_ANISOTROPIC;
unsigned int aniso = 8;
//三线过滤
tfo = Ogre::TFO_TRILINEAR;
aniso = 1;
//双线过滤
tfo = Ogre::TFO_BILINEAR;
aniso = 1;
//无过滤
tfo = Ogre::TFO_NONE;
aniso = 1;
//设置
Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(tfo);
Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(aniso);
Ogre内部定义:
/** High-level filtering options providing shortcuts to settings the
minification, magnification and mip filters. */
enum TextureFilterOptions
{
/// Equal to: min=FO_POINT, mag=FO_POINT, mip=FO_NONE
TFO_NONE,
/// Equal to: min=FO_LINEAR, mag=FO_LINEAR, mip=FO_POINT
TFO_BILINEAR,
/// Equal to: min=FO_LINEAR, mag=FO_LINEAR, mip=FO_LINEAR
TFO_TRILINEAR,
/// Equal to: min=FO_ANISOTROPIC, max=FO_ANISOTROPIC, mip=FO_LINEAR
TFO_ANISOTROPIC
};
enum FilterType
{
/// The filter used when shrinking a texture
FT_MIN,
/// The filter used when magnifying a texture
FT_MAG,
/// The filter used when determining the mipmap
FT_MIP
};
/** Filtering options for textures / mipmaps. */
enum FilterOptions
{
/// No filtering, used for FILT_MIP to turn off mipmapping
FO_NONE,
/// Use the closest pixel
FO_POINT,
/// Average of a 2x2 pixel area, denotes bilinear for MIN and MAG, trilinear for MIP
FO_LINEAR,
/// Similar to FO_LINEAR, but compensates for the angle of the texture plane
FO_ANISOTROPIC
};