หมายเหตุ:ฉันได้พบคำตอบแล้ว (ซึ่งฉันจะโพสต์หลังจากคำถามนี้) - ฉันแค่สงสัยว่าฉันทำถูกหรือว่ามีวิธีที่ดีกว่า
ฉันสร้างเกมภาพสามมิติ "2.5D" โดยใช้ OpenGL ES (JOGL) โดย "2.5D" ฉันหมายความว่าโลกนี้เป็น 3D แต่มันถูกสร้างการแสดงผลโดยใช้แผ่นกระเบื้องสามมิติแบบสองมิติ
ปัญหาเดิมที่ฉันต้องแก้ไขก็คือพื้นผิวของฉันจะต้องแสดงผลตามลำดับ (จากด้านหลังไปข้างหน้า) เพื่อให้กระเบื้องซ้อนทับอย่างถูกต้องเพื่อสร้างผลที่เหมาะสม หลังจากอ่านเสร็จฉันก็รู้ได้ทันทีว่านี่เป็นวิธี 2D "หมวกเก่า" เรื่องนี้กลายเป็นเรื่องยากที่จะทำอย่างมีประสิทธิภาพเนื่องจากผู้เล่นสามารถปรับเปลี่ยนโลก 3 มิติ (ดังนั้นสิ่งต่างๆสามารถปรากฏที่ใดก็ได้ในพื้นที่ 3 มิติ) - ดูเหมือนว่าฉันใช้ประโยชน์จากบัฟเฟอร์ความลึก นั่นหมายความว่าฉันไม่ต้องกังวลกับการแสดงสิ่งต่าง ๆ ในลำดับที่ถูกต้อง
อย่างไรก็ตามฉันประสบปัญหา หากคุณใช้GL_DEPTH_TEST
และGL_BLEND
ร่วมกันมันจะสร้างเอฟเฟกต์ที่วัตถุจะถูกผสมกับพื้นหลังก่อนที่จะ "เรียงลำดับ" ตามลำดับ z (หมายความว่าคุณได้รับการทับซ้อนแบบแปลก ๆ ที่ควรมีความโปร่งใส)
นี่คือรหัสหลอกที่ควรแสดงให้เห็นถึงปัญหา (โดยบังเอิญฉันใช้ libgdx สำหรับ 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
// ...
}
ดังนั้นคำถามคือฉันจะแก้ปัญหาเหลื่อมซ้อนของความโปร่งใสได้อย่างไร