Remarque: J'ai déjà trouvé une réponse (que je publierai après cette question) - Je me demandais simplement si je le faisais bien ou s'il y avait une meilleure façon.
Je fais un jeu isométrique "2.5D" en utilisant OpenGL ES (JOGL). Par "2.5D", je veux dire que le monde est en 3D, mais il est rendu en utilisant des tuiles isométriques 2D.
Le problème initial que j'ai dû résoudre était que mes textures devaient être rendues dans l'ordre (de l'arrière vers l'avant), de sorte que les tuiles se chevauchaient correctement pour créer l'effet approprié. Après quelques lectures, je me suis vite rendu compte qu'il s'agissait de l'approche 2D "à l'ancienne". Cela est devenu difficile à faire efficacement, car le monde 3D peut être modifié par le joueur (donc les choses peuvent apparaître n'importe où dans l'espace 3D) - il semblait donc logique que je profite du tampon de profondeur. Cela signifiait que je n'avais pas à me soucier de rendre les choses dans le bon ordre.
Cependant, j'ai rencontré un problème. Si vous utilisez GL_DEPTH_TEST
et GL_BLEND
ensemble, cela crée un effet où les objets sont mélangés avec l'arrière-plan avant d'être "triés" par ordre z (ce qui signifie que vous obtenez un type de chevauchement étrange là où la transparence devrait être).
Voici un pseudo code qui devrait illustrer le problème (d'ailleurs, j'utilise libgdx pour 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
// ...
}
La question est donc la suivante: comment résoudre le problème de chevauchement de transparence?