Ⅰ 纹理的各向异性过滤
“各向异性过滤”(Anisotropic Filtering,缩写为 AF) 是一种纹理过滤方法。在一些销笑情况下可以提升画面的清晰度。
下面这幅图是来自 ARM 网站。 https://developer.arm.com/documentation/101897/0200/buffers-and-textures/anisotropic-sampling-performance
其中,左图采用一般的“三线性过滤”,右图采用了 2x 的“各向异性过滤”。
可以看到在这个木头箱子的侧面,左图较为模糊,右图较为清晰。
对于有 mipmap 的情形。
如果是“三线性过滤”,会根据纹理坐标的变化率,计算其应该采用哪一级 mipmap。
但,纹理坐标是二维的,有 u,有 v。
如果 v 和 v 的变化率并不一致,则根据 u 和根据 v 可计算得到不同的 mipmap 级别。
一般“三线性过滤”会取两者之间较大的 mipmap,但这样就不精确了。
“各向异性过滤”则会根据 mipmap_u 和 mipmap_v 的差异,进行多次采样,然后综陪镇合。
这样就能提升画质。
实际的采样次数由硬件决定。
当物体的表面正对摄像机时,u 和 v 的亏乱含变化率差异小,采样的次数也少。
当物体表面近乎垂直于视线时,u 和 v 的变化率差异大,采样的次数也多。
程序可以通过图形 API(Direct3D、OpenGL)设置最大采样次数。
设置 2x 的“各向异性过滤”,则最多会采样 2 次。
如果设置 16x 的“各向异性过滤”,则最多会采样 16 次。
次数越多,画质越好,但性能越差。
下图是各种设置的视觉效果对比(为了凸显问题,图片已经被放大至 200%)
“各向异性过滤”会导致更多次数的纹理采样,影响性能。
看各个 GPU 厂商的说法。
按 ARM 的说法,2x 的各向异性过滤是很不错的。不过接下来就需要进一步测试了。特别是苹果,没有找到对应的文章。
用 shader 来做过滤,达到更佳的画质:
https://bgolus.medium.com/sharper-mipmapping-using-shader-based-supersampling-ed7aadb47bec
Ⅱ 显卡特效中的各向异性过滤是什么
Bilinear Interpolation (双线过滤)
这是一种较好的材质影像插补的处理方式,会先找出最接近像素的四个图素,然后在它们之间作差补效果,最后产生的结果才会被贴到像素的位置上,这样不会看到“马赛克”现象。这种处理方式较适用于有一定景深的静态影像,不过无法提供最佳品质。其最大问题在于,当三维物体变得非常小时,一种被称为Depth Aliasing artifacts(深度赝样锯齿),也不适用于移动中的物件。
Trilinear Interpolation (三线过滤)
这是一种更复杂材质影像插补处理方式,会用到相当多的材质影像,而每张的大小恰好会是另一张的四分之一。例如有一张材质影像是512×512个图素,第二张就会是256×256个图素,第三张就会是128×128个图素等等,总之最小的一张是1×1.凭借这些多重解析度的材质影像,当遇到景深极大的场景时(如飞行模拟),就能提供高品质的贴图效果。一个“双线过滤”需要三次混合,而“三线过滤”就得作七次混合处理,所以每个像素就需要多用21/3倍以上的计算时间。还需要两倍大的存储器时钟带宽。但是“三线过滤”可以提供最高的贴图品质,会去除材质的“闪烁”效果。对于需要动态物体或景深很大的场景应用方面而言,只有“三线过滤”才能提供可接受的材质品质。
Anisotropic Interpolation (各向异性过滤)
它在取样时候,会取8个甚至更多的像素来加以处理,所得到的质量最好。
-----------------------------------
在 OpenGL 里我尝试使用 三线过滤 ,出来的画面平滑感觉比 各向异性过滤的还要好点。哈,我就觉得三线过滤效果比各向异性过滤效果好点。在国内的网站上很少关于 OpenGL 使用这三线过滤和各向异性过滤的文章,有的都是理论,没有代码,我看了一个国外的代码。其实就是在加载纹理的时候把代码改为:
// <<<三线过滤>>>
//设置纹理缩小时采用的过滤方法,这里设置的是三线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
//设置纹理放大时采用的过滤方法,这里设置的是线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//用OpenGL实现支持的最大各异向程度设置最大各异向程度参数
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
// <<<各向异性过滤>>>
//设置纹理缩小时采用的过滤方法,这里设置的是三线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
//设置纹理放大时采用的过滤方法,这里设置的是线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//用OpenGL实现支持的最大各异向程度设置最大各异向程度参数
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, xxx);
// 注意:这里的 xxx 代表 各向异性过滤 的异向程度参数
// 你可以设置为:4 , 8 , 16 等。这里也可以在 InitGL() 驱动 OpenGL 函数里写上
int LrgSupAni;
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &LrgSupAni);
那么 xxx 就得小于或等于 LrgSupAni。
Ⅲ 游戏里过滤方式中的“单线性”“双线性”“三线性”“各向异性XX”等是啥意思啊
1、单线性过滤:指进行纹理平滑的一种纹理过滤方法。在大多数情况版下,纹理在屏幕上显示的时候权都不会同保存的纹理一模一样,所以一些像素要使用纹素之间的点进行表示。
2、双线性过滤:指进行缩放显示的时候进行纹理平滑的一种纹理过滤方法。利用这些点在像素所表示点周围四个最近的点之间进行双线性插值。
3、三线性过滤:指用来减轻或消除不同组合等级纹理过渡时出现的组合交叠现象。它必须结合双线性过滤和组合式处理映射一并使用。
4、各向异性过滤:是一种3D显示技术,它是对周围各个方向上的像素进行取样计算后映射到目标像素上的技术。
(3)各向异性过滤模式级别扩展阅读:
相关介绍:
三线性过滤、双线性过滤的原理都是将相邻像素及彼此之间的相对关系都记忆下来,然后在视角改变的时候绘制出来。只不过三线性过滤的采集范围更大,计算更精确,画面更细腻,占用资源也更多。
各向异性过滤的原理是需要对映射点周围方形8个或更多的像素进行取样,获得平均值后映射到像素点上。对于3D游戏来说,各向异性过滤则是很重要的一个功能,因为它可以使画面更加逼真,自然处理起来也比三线性过滤会更慢。
Ⅳ 200分!各向异性过滤是AF平滑处理是AA吗那16XQ是什么意思
中2x、4x、8xQ是标准的MSAA(多重取样抗锯齿),8x、16x、16xQ是CSAA(覆盖取样抗锯齿:Coverage Sampling Antialiasing)。其中8xQ和16xQ是桌面PC领域画面质量最高的抗锯齿模式。由于CSAA的像素取样量大大低于MSAA,因此在很多游戏中,16x的CSAA可以和4x的MSAA达到相近的fps,但是16x CSAA可以提供好的多的画质,只是在少数情况,如DOOM3中大量使用的stencil shadow,CSAA会失效,这时候需要用MSAA来进行抗锯齿。