Pertanyaan saya secara khusus berkaitan dengan Logam, karena saya tidak tahu apakah jawabannya akan berubah untuk API lain.
Apa yang saya percaya saya mengerti sejauh ini adalah ini:
Tekstur yang dipetakan telah mengkomputasi "level detail", di mana level detail yang lebih rendah diciptakan oleh downsampling tekstur asli dengan cara yang bermakna.
Level mipmap dirujuk dalam level detail yang menurun, di mana level
0
adalah tekstur asli, dan level yang lebih tinggi adalah kekuatan dari dua pengurangannya.Sebagian besar GPU menerapkan pemfilteran trilinear, yang mengambil dua tingkat mipmap yang berdekatan untuk setiap sampel, sampel dari setiap tingkat menggunakan penyaringan bilinear, dan kemudian secara linier memadukan sampel-sampel tersebut.
Yang tidak saya mengerti adalah bagaimana level mipmap ini dipilih. Dalam dokumentasi untuk pustaka standar Metal, saya melihat bahwa sampel dapat diambil, dengan atau tanpa menentukan contoh lod_options
tipe. Saya akan berasumsi bahwa argumen ini mengubah cara level mipmap dipilih, dan tampaknya ada tiga jenis lod_options
tekstur 2D:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Sayangnya, dokumentasi tidak repot menjelaskan apa yang dilakukan opsi ini. Saya bisa menebak bahwa bias()
bias beberapa tingkat detail yang dipilih secara otomatis, tetapi kemudian apa artinya bias value
? Pada skala apa ia beroperasi? Demikian pula, bagaimana adalah lod
dari level()
diterjemahkan ke dalam tingkat mipmap diskrit? Dan, beroperasi di bawah asumsi yang gradient2d()
menggunakan gradien dari koordinat tekstur, bagaimana cara menggunakan gradien itu untuk memilih level mipmap?
Lebih penting lagi, jika saya menghilangkan lod_options
, bagaimana level mipmap dipilih? Apakah ini berbeda tergantung pada jenis fungsi yang dijalankan?
Dan, jika operasi standar no-lod-options-ditentukan sample()
fungsi adalah untuk melakukan sesuatu seperti gradient2D()
(setidaknya dalam fragmen shader), apakah itu menggunakan turunan ruang-layar sederhana, atau apakah itu bekerja secara langsung dengan rasterizer dan koordinat tekstur yang diinterpolasi untuk menghitung gradien yang tepat?
Dan akhirnya, seberapa konsistenkah perilaku ini dari satu perangkat ke perangkat lainnya? Artikel lama (seperti pada DirectX 9) yang saya baca mengacu pada pemilihan mipmap spesifik perangkat yang kompleks, tetapi saya tidak tahu apakah pemilihan mipmap lebih baik pada arsitektur yang lebih baru.