Bantu saya memahami Penyaringan Anisotropik (AF)

8

Akhir-akhir ini saya telah membaca tentang penyaringan tekstur, yaitu penyaringan terdekat-tetangga, penyaringan Bilinear, penyaringan Trilinear, penyaringan Anisotropik, peta MIP, peta RIP dan sebagainya.

Dari perspektif tingkat tinggi, saya pikir saya bisa memahami teknik-teknik ini, bagaimana cara kerjanya dan mengapa mereka ada, dengan pengecualian penyaringan Anisotropik. Penyaringan anisotropik membuatku gila.

Saya bisa melihat masalah harus tekstur permukaan yang pada sudut relatif ke kamera, tapi saya tidak mengerti bagaimana sampel jejak kaki trapesium bisa menyelesaikan ini (walaupun saya bisa melihat hasilnya). Ini mungkin karena saya TIDAK mengerti bagaimana jejak trapesium dihitung dan bagaimana teleks tertutup yang tertimbang untuk sampel tekstur.

Artikel ini oleh Nvidia membuat saya semakin bingung dengan menggunakan kalimat sebagai " ketika sebuah texel adalah trapesium " atau " skala penyaringan anisotropik baik tinggi atau lebar mipmap dengan rasio relatif terhadap distorsi perspektif tekstur ". Texel trapesium? Melakukan Penskalaan MIPmap? Apa artinya ini?

Bisakah Anda membantu saya memahami bagaimana level AF dan AF bekerja?

Harap dicatat bahwa tujuan saya BUKAN untuk memiliki implementasi OpenGL atau DirectX AF, tetapi untuk memahami bagaimana AF bekerja dari perspektif tingkat tinggi.

Nicola Masotti
sumber

Jawaban:

10

Untuk memahami sifat dari penyaringan anisotropik, Anda harus memiliki pemahaman yang kuat tentang arti sebenarnya pemetaan tekstur.

Istilah "pemetaan tekstur" berarti menetapkan posisi pada objek ke lokasi dalam tekstur. Ini memungkinkan rasterizer / shader untuk, untuk setiap posisi pada objek, mengambil data yang sesuai dari tekstur. Metode tradisional untuk melakukan ini adalah untuk menetapkan setiap titik pada objek koordinat tekstur, yang secara langsung memetakan posisi itu ke lokasi dalam tekstur. Rasterizer akan menginterpolasi koordinat tekstur ini di seluruh wajah berbagai segitiga untuk menghasilkan koordinat tekstur yang digunakan untuk mengambil warna dari tekstur.

Sekarang, mari kita berpikir tentang proses rasterisasi. Bagaimana cara kerjanya? Dibutuhkan segitiga dan memecahnya menjadi blok berukuran piksel yang akan kita sebut "fragmen". Sekarang, blok-blok berukuran piksel ini berukuran relatif terhadap layar.

Tetapi fragmen-fragmen ini tidak berukuran relatif terhadap tekstur. Bayangkan jika rasterizer kami menghasilkan koordinat tekstur untuk setiap sudut fragmen. Sekarang bayangkan menggambar keempat sudut itu, bukan di ruang layar, tetapi di ruang tekstur . Seperti apa bentuknya?

Yah, itu tergantung pada koordinat tekstur. Artinya, itu tergantung pada bagaimana tekstur dipetakan ke poligon. Untuk setiap fragmen tertentu, itu mungkin persegi yang selaras sumbu. Ini mungkin persegi yang tidak selaras sumbu. Mungkin persegi panjang. Itu mungkin trapesium. Mungkin hampir semua angka empat sisi (atau setidaknya, yang cembung).

Jika Anda melakukan pengaksesan tekstur dengan benar, cara untuk mendapatkan warna tekstur untuk sebuah fragmen adalah dengan mencari tahu apa persegi panjang ini. Kemudian ambil setiap texel dari tekstur dalam persegi panjang itu (menggunakan cakupan untuk skala warna yang ada di perbatasan). Kemudian rata-rata semuanya. Itu akan menjadi pemetaan tekstur yang sempurna.

Itu juga akan sangat lambat .

Untuk kepentingan kinerja, kami mencoba memperkirakan jawaban sebenarnya. Kami mendasarkan hal-hal pada satu koordinat tekstur, daripada 4 yang menutupi seluruh area fragmen dalam ruang texel.

Penyaringan berbasis Mipmap menggunakan gambar beresolusi lebih rendah. Gambar-gambar ini pada dasarnya adalah jalan pintas untuk metode yang sempurna, dengan pra-komputasi seperti apa blok warna yang besar ketika dicampur bersama. Jadi ketika memilih mipmap yang lebih rendah, ia menggunakan nilai pra-komputasi di mana setiap texel mewakili area tekstur.

Penyaringan anisotropik bekerja dengan cara mendekati metode sempurna (yang dapat, dan harus, digabungkan dengan pemetaan) melalui pengambilan sejumlah sampel tambahan yang telah diperbaiki. Tapi bagaimana cara mencari area di ruang texel untuk mengambil, karena masih hanya diberi satu koordinat tekstur?

Pada dasarnya, itu curang. Karena shader fragmen dieksekusi dalam blok tetangga 2x2, dimungkinkan untuk menghitung turunan dari nilai apa pun dalam shader fragmen dalam ruang-ruang X dan Y. Kemudian menggunakan turunan ini, ditambah dengan koordinat tekstur aktual, untuk menghitung perkiraan dari apa jejak tekstur fragmen yang sebenarnya akan. Dan kemudian melakukan sejumlah sampel dalam area ini.

Berikut diagram untuk membantu menjelaskannya:

Jejak fragmen dan sampel anisotropik.  FYI: jika Anda pernah melihatnya, itu milik saya.

Kotak hitam-putih mewakili tekstur kami. Itu hanya kotak-kotak 2x2 texels putih dan hitam.

Titik oranye adalah koordinat tekstur untuk fragmen yang dimaksud. Garis merah adalah jejak fragmen, yang berpusat pada koordinat tekstur.

Kotak hijau mewakili texels yang dapat diakses oleh implementasi penyaringan anisotropik (rincian algoritme penyaringan anisotropik spesifik platform, jadi saya hanya bisa menjelaskan ide umum).

Diagram khusus ini menunjukkan bahwa suatu implementasi mungkin mengakses 4 texels. Oh ya, kotak hijau mencakup 7 dari mereka, tetapi kotak hijau di tengah bisa mengambil dari mipmap yang lebih kecil, sehingga mengambil setara dengan 4 texels dalam satu pengambilan. Implementasi tentu saja akan berat rata-rata untuk yang diambil oleh 4 relatif terhadap yang texel tunggal.

Jika batas penyaringan anisotropik adalah 2 daripada 4 (atau lebih tinggi), maka implementasi akan memilih 2 sampel tersebut untuk mewakili jejak fragmen.

Nicol Bolas
sumber
Terima kasih telah menjelaskan ini dan maaf atas jawaban yang tertunda, tetapi saya harus menemukan waktu untuk membaca ini dengan sangat hati-hati. Saya merasa satu-satunya paragraf yang saya tidak sepenuhnya mengerti adalah paragraf di mana Anda berbicara tentang fragmen dan turunannya. Apa sebenarnya yang diturunkan di layar-ruang X dan Y? Apakah itu nilai koordinat tekstur?
Nicola Masotti
@NicolaMasotti: "Derivatif" adalah istilah kalkulus. Dalam hal ini, itu adalah tingkat perubahan koordinat tekstur, melintasi permukaan segitiga, dalam ruang-layar X atau Y. Jika Anda tidak tahu kalkulus, maka saya tidak akan bisa menjelaskannya untuk Anda dalam satu posting.
Nicol Bolas
Untungnya saya tahu apa itu turunan. Apakah ada tempat saya bisa melihat untuk matematika yang tepat?
Nicola Masotti
Juga, saya akan mengusulkan beberapa perubahan pada jawaban Anda, yaitu " itu tergantung pada bagaimana poligon dipetakan ke tekstur " bukan " itu tergantung pada bagaimana tekstur dipetakan ke poligon ". Juga, ketika Anda mengatakan: " menggunakan cakupan untuk skala warna yang ada di perbatasan ", apakah yang Anda maksud sebenarnya adalah " bobot warna yang ada di perbatasan "?
Nicola Masotti
3

Beberapa poin yang mungkin sudah Anda ketahui, tetapi saya hanya ingin menuliskannya di sana untuk orang lain. Pemfilteran dalam hal ini mengacu pada pemfilteran low-pass seperti yang mungkin Anda dapatkan dari Gaussian Blur atau blur kotak. Kami perlu melakukan ini karena kami mengambil beberapa media yang memiliki frekuensi tinggi di dalamnya, dan menjadikannya dalam ruang yang lebih kecil. Jika kami tidak memfilternya, kami akan mendapatkan artefak aliasing, yang akan terlihat buruk. Jadi kami memfilter frekuensi yang terlalu tinggi untuk direproduksi secara akurat dalam versi skala. (Dan kami melewati frekuensi rendah, jadi kami menggunakan filter "low pass" seperti kabur.)

Jadi mari kita pikirkan hal ini terlebih dahulu dari sudut pandang blur. Kabur adalah jenis konvolusi. Kami mengambil konvolusi kernel dan mengalikannya dengan semua piksel di suatu daerah dan kemudian menambahkannya bersama dan membaginya dengan bobot. Itu memberi kita output satu piksel. Lalu kami memindahkannya dan melakukannya lagi untuk piksel berikutnya selesai, dan lagi, dll.

Sangat mahal untuk melakukannya dengan cara itu, jadi ada cara untuk menipu. Beberapa kernel konvolusi (khususnya kernel Gaussian blur dan box blur) dapat dipisahkan menjadi pass horizontal dan vertikal. Anda dapat memfilter semuanya hanya dengan kernel horizontal terlebih dahulu, kemudian mengambil hasilnya dan memfilternya hanya dengan kernel vertikal, dan hasilnya akan sama dengan melakukan perhitungan yang lebih mahal di setiap titik. Ini sebuah contoh:

Asli:

Hawaii

Blur Horisontal:

Hawaii kabur secara horizontal

Horizontal diikuti oleh Vertical Blur:

Hawaii kabur secara horizontal dan kemudian vertikal

Jadi kita bisa memisahkan penyaringan menjadi lintasan vertikal dan horizontal. Terus? Ya, ternyata kita bisa melakukan hal yang sama untuk transformasi spasial. Jika Anda berpikir tentang rotasi perspektif, seperti ini:

Hawaii Diputar di sekitar sumbu Y

Ini dapat dipecah menjadi skala X:

masukkan deskripsi gambar di sini

diikuti oleh skala setiap kolom dengan jumlah yang sedikit berbeda:

Hawaii diskalakan dalam X dan kemudian secara proporsional dalam Y

Jadi sekarang Anda memiliki 2 operasi penskalaan yang berbeda. Untuk mendapatkan pemfilteran yang benar untuk ini, Anda akan ingin memfilter lebih banyak di X daripada di Y, dan Anda ingin memfilter dengan jumlah yang berbeda untuk setiap kolom. Kolom pertama tidak mendapat penyaringan karena ukurannya sama dengan aslinya. Kolom kedua hanya mendapat sedikit karena itu hanya sedikit lebih kecil dari yang pertama, dll. Kolom terakhir mendapatkan paling banyak penyaringan dari kolom apa pun.

Kata "anisotropi" berasal dari bahasa Yunani "an" yang berarti "tidak", "isos" yang berarti sama, dan "tropo" yang berarti "arah". Jadi itu berarti "tidak sama di semua arah." Dan itulah yang kami lihat - penskalaan dan pemfilteran dilakukan dalam jumlah yang berbeda di setiap arah.

pengguna1118321
sumber