Not: Zaten bir cevap buldum (bu sorudan sonra göndereceğim) - Bunu doğru yapıp yapmadığımı veya daha iyi bir yol olup olmadığını merak ediyordum.
OpenGL ES (JOGL) kullanarak "2.5D" izometrik bir oyun yapıyorum. "2.5D" ile dünyanın 3D olduğunu kastediyorum, ama 2D izometrik karolar kullanılarak oluşturuldu.
Çözmek zorunda olduğum asıl sorun, dokularımın sırayla (arkadan öne) işlenmesi gerektiğiydi, böylece fayanslar doğru efekti oluşturmak için düzgün bir şekilde üst üste biniyordu. Biraz okuduktan sonra, bunun "eski şapka" 2D yaklaşımı olduğunu hemen anladım. Bu, verimli bir şekilde yapmak zorlaştı, çünkü 3D dünyası oyuncu tarafından değiştirilebilir (böylece şeyler 3D uzayda herhangi bir yerde görünebilir) - bu yüzden derinlik tamponundan yararlanmam mantıklı görünüyordu. Bu, şeyleri doğru sırada oluşturma konusunda endişelenmem gerekmediği anlamına geliyordu.
Ancak bir sorunla karşılaştım. Birlikte GL_DEPTH_TEST
ve GL_BLEND
birlikte kullanırsanız , nesnelerin z sırasına göre "sıralanmadan" arka planla karıştırıldığı bir efekt oluşturur (bu, saydamlığın olması gereken yerde garip bir çakışma elde ettiğiniz anlamına gelir).
İşte sorunu göstermek için bazı sahte kod (bu arada, ben Android için libgdx kullanıyorum).
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
// ...
}
Soru şu: Şeffaflık örtüşme problemini nasıl çözebilirim?