Bagaimana cara kerja pemetaan-mip dengan tekstur non-kekuatan-2?

12

Saya telah mendengar bahwa GPU terbaru semua mendukung tekstur non-power-of-2 dan semua fitur hanya berfungsi. Namun, saya tidak mengerti bagaimana pemetaan mip akan bekerja dalam skenario seperti itu. Bisakah seseorang menjelaskan?

ap_
sumber

Jawaban:

13

Aturannya adalah bahwa untuk menghitung ukuran mipmap berikutnya, Anda membaginya dengan dua dan membulatkan ke bilangan bulat terdekat (kecuali jika dibulatkan menjadi 0, dalam hal ini, itu adalah 1). Misalnya, gambar 57x43 akan memiliki mipmaps seperti:

level 0: 57x43
level 1: 28x21
level 2: 14x10
level 3: 7x5
level 4: 3x2
level 5: 1x1

Pemetaan UV, pemilihan LOD, dan penyaringan bekerja dengan cara yang sama seperti untuk kekuatan dua ukuran tekstur.

Menghasilkan mips berkualitas baik untuk tekstur non-power-of-two agak sulit, karena Anda tidak bisa hanya rata-rata kotak 2x2 piksel untuk menurunkan sampel dalam semua kasus. Namun, filter kotak 2x2 tidak terlalu bagus untuk memulai, jadi gunakan filter downsampling yang lebih baik seperti Mitchell-Netravali direkomendasikan terlepas dari ukuran tekstur.

Nathan Reed
sumber
1
Apakah ada perbedaan pendapat antara jawaban ini dan jawaban John Calsbeek? Apakah implementasi cocok dengan kedua deskripsi? Jika tidak maka akan berguna untuk memiliki referensi untuk satu atau yang lain (atau keduanya jika keduanya adalah teknik yang berbeda keduanya digunakan).
trichoplax
4

Salah satu cara untuk memikirkannya adalah bahwa kartu grafis sering menerapkan tekstur non-power-of-2 hanya dengan menambahkannya sampai mereka memiliki kekuatan 2 di setiap arah. Ini membuat sebagian besar hal "hanya berfungsi": ubin dan pemfilteran perangkat keras, misalnya. Satu-satunya hal yang perlu diubah adalah konversi dari koordinat tekstur ke koordinat gambar.

Jika diimplementasikan seperti itu, sudah jelas cara melakukan pemetaan: tidak ada yang berubah. Bahkan jika Anda memiliki GPU yang mendukung tekstur non-power-of-2 tanpa padding, level mipmap akan berakhir dengan "padding". misal tekstur 3x3 akan memiliki tekstur 2x2 seperti lod 1.

John Calsbeek
sumber
Apakah ada perbedaan pendapat antara jawaban ini dan jawaban Nathan Reed? Apakah implementasi cocok dengan kedua deskripsi? Jika tidak maka akan berguna untuk memiliki referensi untuk satu atau yang lain (atau keduanya jika keduanya adalah teknik yang berbeda keduanya digunakan).
trichoplax
1
@trichoplax Saya pikir pernyataan Nathan bahwa "menghasilkan mips berkualitas baik untuk tekstur non-kekuatan-dua agak rumit" membuat jawaban kami sedikit berbeda. Itu saja mungkin pantas untuk dielaborasi lebih lanjut.
John Calsbeek
1
Saya pikir masalahnya di sini adalah bahwa kita membingungkan posisi logis dari texels dengan tata letak "fisik" dalam memori. 1) Pixel adalah item diskrit, yaitu Anda selalu membutuhkan dimensi bilangan bulat, dan dengan demikian menskalakan dimensi ganjil berarti kita harus membulatkan ke atas atau ke bawah. Karena kita harus membulatkan begitu kita mendapatkan tekstur Nx1 atau 1xN, masuk akal untuk selalu membulatkannya. 2) Ketika diletakkan di alamat fisik, tidak jarang untuk pad tekstur ke beberapa ukuran "langkah" "nyaman". Ini dapat dilakukan karena 2 alasan: a) Ini dapat membuat HW lebih murah & b) jika P.of.2, pesanan Morton mudah.
Simon F