① 纹理的各向异性过滤
“各向异性过滤”(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、Trilinear以及Anistropic Filtering(转)
纹理过滤模式是解决纹理采样时像素与纹理像素不对应,导致图像模糊或错位问题的关键技术。在三维图形表面贴图时,像素中心与纹理中心并不完全一致,且像素大小与纹理大小可能不匹配。纹理过滤通过平滑texel与pixel之间的对应关系,实现更清晰、准确的贴图效果。常见的过滤模式包括Nearest Point Sampling(最近点采样)、Bilinear(双线性过滤)、Trilinear(三线性过滤)以及Anisotropic Filtering(各向异性过滤)。
MipMap技术由Lance Williams于1983年提出,用于生成一系列分辨率递减的纹理图像,以提高贴图性能。MipMap由原始图像经过逐级缩放生成,如一张256x256图像可生成从8x8到1x1的七级MipMap。硬件通常支持MipMap的自动生成,通过指定CreateTexture API中的levels参数控制生成级别。
各向同性和各向异性描述了三维表面与屏幕空间的关系。当三维表面平行于屏幕,为各向同性;当表面倾斜,为各向异性。各向异性情况下,纹理变形,需要采用更复杂的过滤模式。Nearest Point Sampling直接选取最近的texel进行采样,适用于纹理与三维图形尺寸相近的情况。Bilinear过滤通过取周围四个texel的平均值,实现像素间过渡的平滑。然而,Bilinear过滤仅适用于某一层MipMap,对于尺寸不匹配的情况效果不佳,于是引入了Trilinear过滤。
Trilinear过滤基于双线性过滤,通过在相邻两层MipMap上进行双线性过滤,再进行线性插值,以提供更平滑、更准确的贴图效果。然而,在各向异性情况下,Trilinear过滤效果有限。各向异性过滤(Anisotropic Filtering)考虑纹理与屏幕空间角度,通过在u和v方向上按比例采样不同数量的点,实现更精确的贴图效果。各向异性过滤在三维表面倾斜时表现更为出色,但性能要求较高。
在性能比较方面,各过滤模式的采样次数不同。Anisotropic Filtering在16X效果最佳,但可能导致显卡性能下降。Anisotropic Filtering是硬件实现的,其具体实现细节相对复杂,无法完全由Pixel Shader实现。实际应用中,通过MipMap技术优化纹理加载,结合适当的过滤模式,可以显著提升图像质量和性能。