Bagaimana penyaringan anisotropik biasanya diterapkan pada GPU modern?

14

Penyaringan anisotropik "mempertahankan ketajaman tekstur yang biasanya hilang oleh upaya tekstur peta MIP untuk menghindari alias". Artikel Wikipedia memberikan petunjuk tentang bagaimana hal itu dapat diterapkan ("menyelidiki tekstur (...) untuk setiap orientasi anisotropi"), tetapi tidak membaca dengan jelas bagi saya.

Tampaknya ada berbagai implementasi, seperti yang disarankan oleh tes diilustrasikan dalam catatan presentasi Perkiraan Model Untuk Rendering Berbasis Fisik : masukkan deskripsi gambar di sini

Apa perhitungan konkret yang dilakukan oleh GPU (modern) untuk memilih level MIP yang benar saat menggunakan penyaringan anisotropik?

usap
sumber
3
Spesifikasi untuk GL_EXT_texture_filter_anisotropicsangat detail. Mungkin ini bisa membantu Anda lebih memahami prosesnya.
glampert

Jawaban:

14

Perangkat keras penyaringan tekstur mengambil beberapa sampel dari berbagai tingkat mipmap (jumlah maksimum sampel ditunjukkan oleh tingkat penyaringan anisotropik, meskipun jumlah persis sampel yang diambil dalam operasi penyaringan tertentu akan tergantung pada proporsi antara turunan pada fragmen. ) Jika Anda memproyeksikan kerucut melihat permukaan pada sudut miring ke ruang tekstur, itu akan menghasilkan sekitar proyeksi berbentuk oval, yang lebih memanjang untuk sudut yang lebih miring. Sampel tambahan diambil di sepanjang sumbu oval ini (dari tingkat mip yang benar, untuk memanfaatkan pra-penyaringan yang mereka tawarkan) dan digabungkan untuk memberikan sampel tekstur yang lebih tajam.

Teknik lain yang dikenal sebagai rip-mapping (disebutkan dalam artikel Wikipedia tentang Pemetaan), yang tidakumum ditemukan di GPU kontemporer, menggunakan tekstur prefiltering. Berbeda dengan mips, teksturnya tidak diperkecil secara seragam tetapi menggunakan berbagai rasio lebar-lebar (hingga rasio tergantung pada tingkat pemfilteran anisotropik yang Anda pilih). Varian - atau mungkin dua varian jika menggunakan pemfilteran trilinear - tekstur kemudian dipilih berdasarkan sudut permukaan untuk meminimalkan distorsi. Nilai piksel diambil menggunakan teknik pemfilteran default (bilinear atau trilinear). Rip-map tidak digunakan di perangkat keras apa pun yang saya tahu karena ukurannya yang terlarang: sementara mipmaps menggunakan penyimpanan 33% tambahan, ripmaps menggunakan 300%. Ini dapat diverifikasi dengan mencatat bahwa persyaratan penggunaan tekstur tidak bertambah ketika menggunakan AF, melainkan hanya bandwidth yang meningkat.

Untuk bacaan lebih lanjut, Anda mungkin ingin melihat spesifikasi untuk ekstensi OpenGL EXT_texture_filter_anisotropic . Ini merinci rumus yang digunakan untuk menghitung sampel dan cara menggabungkannya saat menggunakan penyaringan anisotropik.

yurik
sumber
5
Peta RIP juga mungkin tidak digunakan karena tidak membantu pada kasus diagonal yang agak umum. FWIW, jika Anda dapat menemukan kode untuk Microsoft Refrast, implementasi filter anistropik di dalamnya mungkin merupakan referensi yang baik untuk bagaimana HW saat ini melakukannya.
Simon F
1
"Ini dapat diverifikasi dengan mencatat bahwa persyaratan penggunaan tekstur tidak bertambah ketika menggunakan AF, melainkan hanya bandwidth yang meningkat." Argumen pembunuh. Jawaban yang bagus!
David Kuri
Tautan "Rasterisasi Perangkat Lunak Kinerja Tinggi pada GPU" hanya menyebutkan penyaringan anisotropik secara sepintas, dan tidak menyebutkan detail apa pun. Jadi saya akan mengeditnya karena saya pikir itu tidak relevan dengan cara yang bermanfaat.
yuriks
@SimonF juga dapat kita tambahkan bahwa persyaratan bandwidth tambahan cukup menakutkan.
v.oddou
9

Persyaratan API dapat ditemukan di salah satu spesifikasi atau ekstensi. Ini satu: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

Semua vendor GPU kemungkinan menyimpang dari spesifikasi karena kualitas AF dulu menjadi bagian dari banyak tolok ukur. Dan implementasi saat ini akan terus berkembang seiring beban kerja baru yang menekankan perkiraan yang ada. Sayangnya, untuk mengetahui apa yang dilakukan keduanya, Anda harus menjadi bagian dari salah satu perusahaan. Tetapi Anda dapat mengukur spektrum kemungkinan dari makalah-makalah berikut, yang tercantum dalam urutan kualitas dan biaya implementasi yang meningkat:

Mengutip dari spec:

 Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 
ap_
sumber