OpenGL - tepi putih pada kubus

12

Dalam game seperti minecraft yang saya buat, saya mendapatkan tepi putih di kubus saya:

masukkan deskripsi gambar di sini

Ini jauh lebih terlihat dalam tekstur yang lebih gelap. Tekstur sedang diatur seperti ini: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Ada bantuan?

Luis Cruz
sumber
3
Bisakah Anda menunjukkan beberapa kode tentang bagaimana Anda membuat setiap kubus dan bagaimana Anda menempatkan kubus?
joncodo
1
Apakah membungkus tekstur memiliki perbedaan? Seperti apa teksturnya / ukuran yang Anda ikat?
Chuck D
Saya hanya ingin menunjukkan bahwa saya pernah melihat ini juga terjadi di atlas tekstur besar, yang menggunakan ubin kecil. Sebagai contoh, katakan Anda memiliki 1024 * 1024 tileset / atlas, dan ubin yang Anda gunakan 32 * 32. Anda mendapatkan kesalahan pembulatan karena titik desimal yang memetakan ke ubin tersebut adalah ganda yang sangat kecil. Ini membuat presisi nyaris mustahil. Sebuah solusi? Pecah atlas ubin menjadi ubin individu. Inilah yang dilakukan Minecraft, atau yang biasa dilakukan. Mereka memiliki satu tileset besar, dan pada saat runtime mereka memotongnya menjadi tekstur individu.
Krythic

Jawaban:

19

Ada dua kemungkinan penyebab untuk jenis masalah ini, tergantung pada masalah yang sebenarnya. Saya akan daftar keduanya:

1. Anda melihat warna lain dari tekstur Anda di sepanjang tepi ubin.

Bagi saya ini adalah masalah dalam kasus ini, karena semua piksel tepi adalah salah satu dari tiga warna yang masuk akal dalam tekstur Anda: putih, hitam, dan cokelat.

Jika Anda menggunakan beberapa gambar ubin tepat di sebelah satu sama lain dalam satu tekstur (atlas tekstur), seperti yang saya asumsikan sedang Anda lakukan, ini tidak bisa dihindari. Ini terjadi karena GPU tidak cocok dengan interpolasi di sepanjang tepi segitiga dengan interpolasi di sepanjang tekstur, dan Anda mendapatkan potongan kecil dari tekstur yang berdekatan.

Ada beberapa hal yang dapat Anda lakukan.

  • Gunakan tekstur array alih-alih atlas tekstur. Tekstur array terdiri dari tumpukan gambar 2D dengan ukuran yang sama, dan Anda menentukan koordinat ketiga untuk memilih satu; itu dimaksudkan persis sebagai pengganti tekstur atlas tanpa masalah penyaringan. Namun, tekstur array adalah fitur yang lebih baru mungkin tidak tersedia dalam versi OpenGL yang Anda gunakan.
  • Hasilkan batas 1-piksel di setiap ubin tekstur Anda, yang mereplikasi warna piksel biasa yang berdekatan. (Ini pada dasarnya menerapkan ulang GL's CLAMP[_TO_EDGE], tetapi dengan cara yang menyadari tekstur atlas - penggunaannya tidak berpengaruh karena sebagian besar tepi ubin Anda tidak di tepi tekstur.) Ini adalah solusi yang saya gunakan dalam entri saya sendiri dalam genre, Cubes . Saya tahu tidak ada kerugian tertentu kecuali bahwa ia menggunakan lebih banyak memori tekstur.
  • Sangat sedikit inset koordinat tekstur Anda, sehingga mereka tidak pergi jauh ke tepi ubin tekstur. Melakukan ini terlalu banyak akan menyebabkan ketipisan tepi tekstur yang terlihat dibandingkan dengan piksel di tengah.
  • Gunakan tekstur tunggal per jenis ubin. Ini membebankan biaya pengalihan tekstur.

2. Anda melihat celah di antara ubin.

Saya tidak berpikir ini adalah masalah dalam hal ini, karena tidak ada lahan hijau yang terlihat melalui celah, tapi saya memasukkannya untuk kelengkapan.

Ini dapat terjadi ketika Anda tidak memberikan koordinat yang persis sama untuk simpul tepi pertemuan ubin yang berdekatan, yang biasanya muncul karena kesalahan titik-mengambang. Misalnya, jika Anda memiliki ubin dengan ukuran 0,6 dan menghitung tepi kanan ubin x=100dengan (100*0.6) + 0.6, dan tepi kiri ubin x=101dengan (100*0.6), Anda tidak akan mendapatkan jawaban yang sama persis, dan perbedaannya dapat dilihat sebagai bintik kecil dari kesenjangan.

Solusinya adalah untuk memastikan bahwa aritmatika Anda konsisten; beberapa cara untuk melakukan ini adalah:

  • Pastikan Anda tidak (bahkan secara tidak langsung) komputasi index*size + size, tetapi hanya (index+1)*size.
  • Pastikan aritmatika Anda tepat; cara termudah untuk melakukan ini adalah dengan membuat ukuran ubin Anda tepat 1,0, yang akan menghasilkan aritmatika integer yang tepat bahkan jika Anda melakukan perhitungan dengan float 32-bit (toh, hingga 16 juta blok dari asalnya, toh).
  • Gunakan bilangan bulat aktual untuk perhitungan koordinat titik; ini membuat Anda semakin jangkauan.
Kevin Reid
sumber
Sepertinya ada celah untuk saya - tidak ada tekstur yang berdarah (kecuali beberapa tekstur beresolusi tinggi) mengingat bit yang kecil dan tajam.
Mario
Terima kasih, mengatur koordinat tekstur sedikit untuk memperbaikinya.
Luis Cruz
@ Mario Saya menganggap ini dengan perbesaran TERDEKAT - perhatikan perbatasan tajam pada interior ubin. Jadi untuk perspektif itu, itu adalah tekstur resolusi tak terbatas.
Kevin Reid
Anda juga bisa menggunakan larik tekstur untuk menghindari pergantian biaya.
danijar