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:
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.
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:
Blur Horisontal:
Horizontal diikuti oleh Vertical Blur:
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:
Ini dapat dipecah menjadi skala X:
diikuti oleh skala setiap kolom dengan jumlah yang sedikit berbeda:
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.
sumber