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.
Jawaban:
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
N
sedemikian rupa sehingga gambar menengah memiliki ukuranN×N
, lebih besar dari64×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.
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 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 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, cobaN = 256
dll. Sampai Anda mendapatkan ukuran yang benar.sumber