概念介紹
“各向異性過濾”(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 廠商的說法。
- 高通
https://developer.qualcomm.com/qfile/34706/80-nb295-7_a-adreno_vulkan_developer_guide.pdfTexture filtering can influence the speed of texture sampling. A bilinear texture lookup in a 2D
texture on a 32-bit format costs a single cycle. Adding trilinear filtering doubles that cost to two
cycles. Mipmap clamping may reduce this to bilinear cost though, so the average cost might be
lower in real-world cases. Adding anisotropic filtering multiplies with the degree of anisotropy.
That means a 16x anisotropic lookup can be 16 times slower than a regular isotropic lookup.
However, because anisotropic filtering is adaptive, this hit is taken only on fragments that require
anisotropic filtering. It could be only a few fragments in all. A rule of a thumb for real-world
cases is that anisotropic filtering is, on average, less than double the cost of isotropic.
翻譯:
單次的 bilinear 采樣凹联,耗費一個 cycle沐兰。
trilinear 采樣會加倍,也就是兩個 cycle蔽挠。
而有時候 mipmap clamping 會使開銷降低至與 bilinear 等同住闯。所以平均是低于兩個 cycle 的。
各向異性過濾會導致 N 倍開銷。如果是 16x 各向異性過濾比原,則比正常的過濾慢 16 倍插佛。
然而,各向異性過濾是自適應的量窘,只在最傾斜的那些像素(片元)才會有 16 倍雇寇。通常只會增加少量開銷。
通常而言蚌铜,平均是小于“不用各向異性過濾”時的兩倍 - ARM
https://developer.arm.com/documentation/101897/0200/buffers-and-textures/anisotropic-sampling-performanceUsing 2x bilinear AF, instead of trilinear filtering, increases image quality and can also improve performance.
Using high levels of max anisotropy can improve image quality, but at the cost of performance.
翻譯:使用 2x bilinear AF 性能和質量都會比 trilinear 更好锨侯。但 AF 的倍數增加之后,質量會進一步提升冬殃,但是性能下降识腿。 - 蘋果
暫時沒有找到對此問題有準確描述的文檔。 - nVidia
沒仔細找官方文檔造壮。但看起來似乎影響很微弱渡讼。
在這個《泰坦墜落 2》游戲的推薦配置中,使用各向異性過濾之后耳璧,幀率幾乎沒有變化成箫。
https://www.nvidia.com/en-us/geforce/news/titanfall-2-graphics-performance-and-tweaking-guide/
可能不同游戲會有不同,例如這個游戲的瓶頸不在紋理采樣旨枯,則當使用各向異性過濾蹬昌,可能不會影響幀率。
按 ARM 的說法攀隔,2x 的各向異性過濾是很不錯的皂贩。不過接下來就需要進一步測試了。特別是蘋果,沒有找到對應的文章。
擴展閱讀
用 shader 來做過濾悟衩,達到更佳的畫質:
https://bgolus.medium.com/sharper-mipmapping-using-shader-based-supersampling-ed7aadb47bec