Catatan: Saya sudah menemukan jawaban (yang akan saya posting setelah pertanyaan ini) - Saya hanya ingin tahu apakah saya melakukannya dengan benar, atau apakah ada cara yang lebih baik.
Saya membuat game isometrik "2.5D" menggunakan OpenGL ES (JOGL). Dengan "2.5D", maksud saya bahwa dunia adalah 3D, tetapi diterjemahkan menggunakan ubin isometrik 2D.
Masalah asli yang harus saya selesaikan adalah bahwa tekstur saya harus dirender agar (dari belakang ke depan), sehingga ubin tumpang tindih dengan benar untuk menciptakan efek yang tepat. Setelah membaca, saya segera menyadari bahwa ini adalah pendekatan 2D "topi tua". Ini menjadi sulit dilakukan secara efisien, karena dunia 3D dapat dimodifikasi oleh pemain (sehingga barang dapat muncul di mana saja dalam ruang 3D) - jadi sepertinya logis bahwa saya memanfaatkan kedalaman penyangga. Ini berarti bahwa saya tidak perlu khawatir tentang membuat barang-barang dalam urutan yang benar.
Namun, saya menghadapi masalah. Jika Anda menggunakan GL_DEPTH_TEST
dan GL_BLEND
bersama - sama, itu menciptakan efek di mana objek dicampur dengan latar belakang sebelum mereka "diurutkan" berdasarkan urutan z (artinya Anda mendapatkan semacam tumpang tindih yang aneh di mana transparansi seharusnya).
Berikut adalah beberapa kode semu yang seharusnya menggambarkan masalah (kebetulan, saya menggunakan libgdx untuk Android).
create() {
// ...
// some other code here
// ...
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glEnable(GL10.GL_BLEND);
}
render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
// ...
// bind texture and create vertices
// ...
}
Jadi pertanyaannya adalah: Bagaimana cara saya mengatasi masalah transparansi yang tumpang tindih?
Jawaban:
OK, jadi inilah solusi saya (tolong beri komentar jika itu bisa dilakukan dengan lebih baik) ...
Ternyata saya sebenarnya harus menggunakan pengujian alpha (meskipun, saya menemukan ini secara tidak sengaja, jadi saya tidak sepenuhnya yakin mengapa ia bekerja).
Perhatikan penggunaan
GL_ALPHA_TEST
, danglAlphaFunc
.sumber
Pengujian alfa digunakan untuk menghentikan renderer menggambar piksel ke buffer apa pun, termasuk buffer z. Alpha blending hanyalah hal visual - nilai-nilai masih ditulis ke zbuffer, yang dapat menyebabkan masalah seperti ini - piksel tak terlihat berada di depan piksel yang selanjutnya dibuat yang berarti mereka akan gagal ztest ketika Anda menggambar piksel baru. Inilah yang dapat Anda lihat pada gambar yang Anda berikan, ztest gagal.
Menonaktifkan penulisan juga akan mencapai tujuan yang sama tetapi Anda harus memastikan bahwa Anda menarik semuanya kembali ke urutan depan. Ini harus cukup mudah dilakukan di gim isometrik Anda.
sumber