Bagaimana cara menggunakan pengujian mendalam dan transparansi tekstur bersama di dunia 2.5D saya?

11

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_TESTdan GL_BLENDbersama - 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).

masalah transparansi tumpang tindih

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?

Nick Bolton
sumber
2
Hanya sebuah komentar untuk memberi tahu Anda bahwa saya telah menggunakan cara yang persis sama dengan Anda untuk mesin 2D saya: pertama-tama mencoba menjadi ubin yang pintar dan mengurutkan-Z sendiri, kemudian menyadari bahwa tidak ada alasan adegan itu harus datar, sehingga memberikan ubin saya sebuah Z mengoordinasikan dan mengaktifkan uji alfa. Tidak yakin apakah Anda benar, tetapi Anda tidak sendirian :-)
sam hocevar

Jawaban:

7

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).

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

Perhatikan penggunaan GL_ALPHA_TEST, dan glAlphaFunc.

Nick Bolton
sumber
Itu memecahkan masalah saya juga. Terima kasih telah berbagi. Anda hebat
Mathlover
2

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.

Luther
sumber
1
Saya pikir menggambar hal-hal dari belakang ke depan adalah mudah dalam game 2D iso hanya ketika Anda memiliki pesawat Y yang tetap, dan perancang berada dalam kendali penuh dunia. Namun, ketika barang bisa ada di mana saja dalam ruang 3D, dan Anda mengizinkan pengguna untuk mengubah barang, itu menjadi lebih rumit. Saya pikir menggunakan buffer kedalaman akan membuat hidup saya jauh lebih mudah.
Nick Bolton