Saya mencoba melakukan resolusi rendering bergerak sprite independen dalam game 2D. Rencana saya bekerja dalam sistem koordinat tetap di dunia saya (misalnya 960x540) dan menggunakan proyeksi ortografis untuk skala yang naik atau turun agar sesuai dengan viewport. Saya melakukan letterboxing untuk menangani rasio aspek yang berbeda.
Menurut sebagian besar tutorial, saya bebas menggunakan dimensi apa pun yang saya suka untuk tampilan frustum, tetapi saya menemukan bahwa dalam banyak kasus yang mengarah ke masalah yang akhirnya saya gunakan nilai-nilai subpixel pada viewport. Sebagai contoh titik di (62,62) dalam sistem koordinat 960 x 540 berakhir di (51.6666667,51.6666667) pada viewport dengan dimensi 800 x 450.
Saya perhatikan dua macam masalah dengan itu:
- sampling tekstur berubah sepanjang waktu untuk objek yang bergerak tergantung pada tempat simpul dalam kaitannya dengan pusat piksel
- objek saya bisa melebar secara horizontal atau vertikal dengan piksel dari waktu ke waktu karena pembulatan
Apa praktik terbaik untuk menghindari ini (sambil mempertahankan resolusi independensi dalam hal kecepatan gerakan dan sebagainya)? Dan di mana tempat terbaik untuk mengatasi ini? Sebelum melewati simpul ke shader atau di dalam vertex shader?
sumber
Jawaban:
Untuk sampai ke pertanyaan utama Anda, apakah atau tidak mempengaruhi simpul sebelum atau selama shader, lebih disukai menggunakan shader. Jika Anda tahu cara menulis rutin yang dapat memperhitungkan viewport dan sistem koordinat, menggunakan shader lebih disukai karena memungkinkan banyak sprite disesuaikan secara paralel. Selain itu, memastikan koordinat "kosmetik" tetap terpisah dari koordinat dalam game dalam kode CPU sehingga yang satu tidak memengaruhi yang lain.
Anda dapat melakukan ini baik di vertex ATAU pixel shader. Dalam pixel shader dimungkinkan untuk menggeser texels untuk menguncinya ke piksel pada tampilan.
Dalam DirectX9 saya perlu melakukan ini dengan HLSL agar dapat mengatasi kekhasan bahwa sudut texel terletak di 0,5, 0,5 relatif terhadap pixel , membuat tekstur yang tajam terlihat semi-buram. Mengoreksi ini mengubah lokasi fisik texels tanpa memindahkan simpul.
Dalam kasus Anda, offset akan bervariasi dari bingkai ke bingkai, jadi berikan koordinat sprite yang sebenarnya ke shader untuk menghitung offset desimal. Ingat untuk MENJepit sampel tekstur untuk menghindari pembungkus dalam tekstur.
sumber
Saya pikir saya akan menyimpan dua set koordinat.
DISPLAY POSITION
danTRUE POSITION
.Dengan cara ini Anda dapat menggambar sprite dengan koordinat bulat untuk menghilangkan distorsi yang disebabkan oleh ukuran tetap area tampilan Anda.
Tetapi ini juga memungkinkan Anda untuk menjaga lokasi yang tepat tanpa mempengaruhi logika permainan Anda. karena sifat sub-piksel saya juga berpikir Anda bahkan tidak akan melihat adanya perbedaan antara tampilan dan logika permainan.
sumber