Bagaimana cara menghindari nilai subpixel dalam resolusi game 2D independen dengan proyeksi ortografis?

8

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?

Eric
sumber
Bagaimana Anda melakukan pengubahan ukuran dan terjemahan agar sesuai dengan viewport baru? Matriks? Menskalakan dan memindahkan posisi objek secara manual?
Emir Lima
@ EmirLima Saya mengalikan koordinat dengan model-view-proyeksi-matriks gabungan di dalam shader vertex saya. Semua penskalaan dilakukan oleh matriks proyeksi ortografis.
Eric
Anda bisa memutari atau meratakan coords, (mungkin dalam vert shader)
t123
@ tm1rbrt Terima kasih atas komentar Anda. Saya pikir saya harus selalu lantai atau langit-langit untuk menghindari 1 pixel lebih atau kurang lebar atau tinggi. Saya mencoba melakukan itu di dalam shader vertex, tetapi ketidaktepatan dalam perhitungan membuat itu sulit jika bukan tidak mungkin. Saya akhirnya lantai apa yang seharusnya bilangan bulat sempurna ke bilangan bulat sebelumnya.
Eric

Jawaban:

1

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.

ChrisC
sumber
3

Saya pikir saya akan menyimpan dua set koordinat.

  1. Satu digunakan untuk menggambar objek Anda DISPLAY POSITIONdan
  2. yang kedua digunakan untuk menyimpan a TRUE 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.

Joe
sumber