Ukuran sprite optimal untuk rotasi

8

Saya membuat game berbasis sprite, dan saya memiliki banyak gambar yang saya dapatkan dalam resolusi sangat besar dan saya menskalakannya ke ukuran sprite yang diinginkan (misalnya 64x64 piksel) sebelum mengubahnya menjadi sumber daya game, jadi ketika menggambar saya sprite di dalam gim, saya tidak harus mengukurnya.

Namun, jika saya memutar sprite kecil ini di dalam gim (engine agnostically), beberapa piksel tujuan akan diinterpolasi, dan sprite akan terlihat tercoreng.

Ini tentu saja tergantung pada sudut rotasi serta algoritma interpolasi, tetapi terlepas dari itu, tidak ada cukup data untuk sampel dengan benar piksel tujuan tertentu.

Jadi ada dua solusi yang bisa saya pikirkan. Yang pertama adalah menggunakan gambar besar asli, memutarnya ke sudut yang diinginkan, dan kemudian turunkan semua variasi reaulting, dan letakkan di atlas, yang memiliki keuntungan karena cukup sederhana untuk diimplementasikan, tetapi secara naif mengkonsumsi sprite dua kali lebih banyak ruang untuk setiap rotasi (setiap rotasi harus ditulis dalam lingkaran yang diameternya adalah diagonal dari persegi panjang sprite asli, yang luasnya dua kali dari persegi panjang asli, seandainya sprite persegi).

Ini juga memiliki kekurangan hanya memiliki seperangkat rotasi yang tersedia, yang mungkin oke atau tidak tergantung pada gim.

Jadi pilihan lain adalah menyimpan gambar yang lebih besar, dan memutar dan menurunkan skala saat rendering, yang mengarah ke pertanyaan saya.

Berapa ukuran optimal untuk sprite ini? Arti optimal bahwa gambar yang lebih besar tidak akan berpengaruh pada gambar yang dihasilkan.

Ini jelas tergantung pada ukuran gambar, jumlah rotasi yang diinginkan tanpa kehilangan data hingga 1/256, yang merupakan perbedaan warna minimum yang dapat diwakili.

Saya mencari jawaban umum teoretis untuk masalah ini, karena mencoba banyak ukuran mungkin baik-baik saja, tetapi masih jauh dari optimal.

Piyama Panda
sumber
3
Ini bukan jawaban yang membantu, tetapi saya membaca pertanyaan itu, berkata, "Oh, itu mudah!", Pergi untuk menulis jawaban, mengerutkan kening, membacanya lagi, dan kemudian memikirkannya dengan sangat sulit selama beberapa menit sebelum menyimpulkan bahwa itu sebenarnya tidak mudah. Yang mengatakan, naluri saya adalah "dua kali resolusi pada setiap sumbu adalah sempurna atau pasti cukup baik", tetapi saya tidak punya bukti untuk ini. Akhirnya, saya menduga ini tergantung secara dramatis pada kernel downscaling yang Anda bandingkan - kernel rata-rata piksel mungkin mudah untuk dianalisis dan direplikasi, tetapi kernel Lanczos mungkin terbukti mustahil.
ZorbaTHut
Saya pikir asumsi Anda bahwa 1/256 adalah batas delta perbedaan warna yang dapat diterima adalah salah karena colourpace tradisional (sRGB) adalah non-linear.
sam hocevar
@ Sam Mungkin tidak linear ketika dikompensasi dengan spektrum cahaya aktual, tetapi kuantisasi linier. Namun, itu benar-benar tergantung pada algoritma interpolasi, dan hasilnya mungkin sangat berbeda untuk linear dan katakanlah, interpolasi bikubik. Tetapi bahkan tanpa interpolasi harus ada cara untuk menghitung ukuran optimal.
Panda Pajama
@zorbathut Jawabannya pasti berbeda tergantung pada algoritma downsampling. Tetapi seharusnya relatif sederhana untuk menghasilkan solusi umum untuk tetangga terdekat atau interpolasi linier. Saya masih mengerjakannya, tapi saya pikir untuk 8 arah, sqrt (2) area optimal. Beri tahu saya di mana Anda harus
Panda Pajama

Jawaban:

7

Saya pikir apa yang Anda coba lakukan adalah ruang gambar 2D yang setara dengan pembulatan ganda . Saya dapat membangun bukti longgar bahwa tidak mungkin untuk menemukan ukuran menengah seperti itu, setidaknya dalam kasus algoritma downscaling sederhana seperti interpolasi linier.

Misalkan kita menemukan Nsedemikian rupa sehingga gambar menengah memiliki ukuran N×N, lebih besar dari 64×64. Misalkan kita bahkan belum menerapkan rotasi (sudutnya nol).

Sekarang mari kita buat gambar yang tidak berfungsi.

Membangun gambar perantara

Pertimbangkan gambar setengah jadi sepenuhnya hitam. Jelas, gambar akhir akan sepenuhnya hitam juga. Kemudian, tambahkan satu piksel abu-abu dengan intensitas minimum (R¸G, B = 1,1,1). Gambar akhir masih harus sepenuhnya hitam. Tambahkan piksel abu-abu lain dengan menyentuh yang pertama. Lanjutkan membangun lingkaran sampai gambar akhir tidak lagi sepenuhnya hitam.

membangun citra menengah Gambar 1

Sekarang satu piksel pada gambar akhir berwarna abu-abu (jika kami melanjutkan selamanya, gambar yang dihasilkan akan sepenuhnya abu-abu, jadi jelas pada satu titik satu piksel menjadi abu-abu), dan jika kami menghapus piksel terakhir itu, warnanya menjadi hitam kembali.

Membangun gambar asli

Pertimbangkan citra asli hipotetis yang mengarah ke citra perantara kita. Saya tidak dapat membuktikan bahwa itu ada, tetapi saya memiliki perasaan kuat bahwa itu memang ada. Misalnya, jika gambar asli memiliki ukuran 2N×2N, ini bisa berupa:

gambar asli Gambar 2

Saat menurunkan Gambar 2 ke ukuran menengah, kita mendapatkan Gambar 1.

Dan dengan hipotesis, saat downscaling ke 64×64, kita mendapatkan satu titik abu-abu di gambar akhir.

Sekarang mari kita pisahkan pixel terakhir yang kami tambahkan dan sebarkan di sekitar cluster asli:

gambar tidak berfungsiGambar 3

Ini adalah contoh tandingan kami.

Ketika diturunkan ke ukuran akhir, gambar ini akan memberi kita piksel abu-abu, karena piksel yang kami sebarkan bahkan lebih dekat ke gugus, sehingga intensitas global setidaknya sama tingginya.

Ketika diturunkan ke ukuran menengah, gambar ini harus kehilangan piksel khusus karena telah tersebar, jadi kami mendapatkan gambar yang sepenuhnya hitam ketika melakukan pengubahan ukuran dua langkah.

Kesimpulan dan pemikiran masa depan

Saya harap ini meyakinkan Anda bahwa apa yang Anda coba capai tidak akan berhasil dalam kasus umum.

Pendekatan saya terhadap masalah Anda adalah menghitung ukuran terbaik per gambar : mulai dengan gambar asli dan mis. N = 128, lalu coba semua sudut yang memungkinkan dan hitung kesalahan maksimum. Jika kesalahan maksimum tidak memuaskan, coba N = 256 dll. Sampai Anda mendapatkan ukuran yang benar.

sam hocevar
sumber
Melihat masalah ini sebagai pembulatan ganda adalah pendekatan yang cukup menarik, tetapi saya ingin tidak setuju dengan hipotesis Anda bahwa itu tidak mungkin, karena Anda melihat ini secara numerik, bukan sebagai masalah sinyal. Mari kita pertimbangkan sinyal 1 dimensi. Dengan mengambil sampel pada titik n , kami akan menyimpan semua informasi dengan frekuensi hingga 1 / 2n . Dengan menggunakan teorema Nyquist, dimungkinkan untuk mengambil sampel sinyal pada titik m> n , dan kemudian menguji ulang pada titik n , dan tiba pada hasil yang sama seolah-olah kita awalnya mengambil sampelnya pada titik n . Ini dapat dengan mudah diperluas ke dimensi-n.
Panda Pyjama
1
@PandaPajama sayangnya dengan memohon Nyquist Anda berasumsi bahwa sinyal dapat dibuat terbatas-band, yang tidak terjadi ketika sampel kami menggunakan domain diskrit. Ini adalah apa yang saya contohkan mengeksploitasi dan mengapa itu terkait dengan pembulatan.
sam hocevar
Jika gambar asli berukuran besar, ini dapat dianggap seolah-olah berada pada domain kontinu. Namun, pada diskusi yang lebih praktis, argumen Anda valid ketika mempertimbangkan algoritma yang sangat spesifik untuk downscaling dengan ukuran yang sangat spesifik (2x). Interpolasi tetangga terdekat, bilinear dan bikubik akan memberikan hasil yang berbeda. Khusus untuk tetangga terdekat, saya percaya adalah mungkin untuk membuat solusi umum secara geometris, tetapi itu harus menunggu akhir pekan.
Panda Pyjama
1
@PandaPajama Anda benar lagi, gambar yang sangat besar dapat dianggap berkelanjutan, tetapi masalahnya adalah gambar perantara masih ada di domain diskrit. Juga, tetangga terdekat tidak akan menderita dari masalah pembulatan menurut definisi, tetapi selain dari kasus sepele itu akan menderita 1) masalah yang terkait dengan teorema pemerataan yang akan membuat ukuran minimum mendekati 6400 × 6400, yaitu. cukup tidak praktis, dan 2) masalah aliasing yang parah.
sam hocevar