Saya memiliki mesin gim 2D yang menggambar tilemaps dengan menggambar ubin dari gambar tileset. Karena secara default OpenGL hanya dapat membungkus seluruh tekstur ( GL_REPEAT
), dan bukan hanya sebagian saja, setiap ubin dibagi menjadi tekstur yang terpisah. Kemudian daerah dari ubin yang sama diberikan berdekatan satu sama lain. Begini tampilannya saat berfungsi sebagaimana dimaksud:
Namun begitu Anda memperkenalkan penskalaan pecahan, lapisan muncul:
Mengapa ini terjadi? Saya pikir itu karena penyaringan linier memadukan batas paha depan, tetapi itu masih terjadi dengan penyaringan titik. Satu-satunya solusi yang saya temukan sejauh ini adalah untuk memastikan semua penentuan posisi dan penskalaan hanya terjadi pada nilai integer, dan menggunakan penyaringan titik. Ini dapat menurunkan kualitas visual game (khususnya bahwa penempatan sub-pixel tidak lagi berfungsi sehingga gerakannya tidak begitu mulus).
Hal-hal yang saya coba / pertimbangkan:
- antialiasing mengurangi, tetapi tidak sepenuhnya menghilangkan, lapisannya
- mematikan mipmapping, tidak berpengaruh
- merender setiap ubin secara individual dan mengekstrusi tepinya dengan 1px - tetapi ini adalah de-optimisasi, karena tidak dapat lagi merender wilayah ubin dalam sekali jalan, dan membuat artefak lain di sepanjang tepi bidang transparansi
- tambahkan perbatasan 1px di sekitar gambar sumber dan ulangi piksel terakhir - tetapi kemudian tidak lagi menjadi dua, yang menyebabkan masalah kompatibilitas dengan sistem tanpa dukungan NPOT
- menulis shader khusus untuk menangani gambar ubin - tetapi lalu apa yang akan Anda lakukan secara berbeda?
GL_REPEAT
harus mengambil piksel dari sisi berlawanan dari gambar di perbatasan, dan tidak memilih transparansi. - geometri persis berbatasan, tidak ada kesalahan pembulatan titik mengambang.
- jika shader fragmen dikode keras untuk mengembalikan warna yang sama, jahitannya hilang .
- jika teksturnya diatur
GL_CLAMP
sebagai gantiGL_REPEAT
, pelipatannya hilang (meskipun renderingnya salah). - jika tekstur diatur ke
GL_MIRRORED_REPEAT
, jahitannya hilang (walaupun renderingnya salah lagi). - jika saya membuat latar belakang merah, jahitannya masih putih. Ini menunjukkan bahwa sampel itu berwarna putih buram dari suatu tempat daripada transparansi.
Jadi jahitan hanya muncul ketika GL_REPEAT
diatur. Untuk beberapa alasan dalam mode ini saja, di tepi geometri ada beberapa perdarahan / kebocoran / transparansi. Bagaimana itu bisa terjadi? Seluruh teksturnya buram.
GL_NEAREST
pengambilan sampel dalam R
arah koordinat juga berfungsi sama baiknya dengan tekstur array untuk sebagian besar hal dalam skenario ini. Pemetaan pemetaan tidak akan berfungsi, tetapi menilai dengan aplikasi Anda, Anda mungkin tidak perlu memetakan peta mini.