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?
Réponses:
OK, voici donc ma solution (veuillez commenter si cela peut être mieux fait) ...
Il s'avère que je devrais en fait utiliser les tests alpha (cependant, j'ai découvert cela par accident, donc je ne sais pas vraiment pourquoi cela fonctionne).
Notez l'utilisation de
GL_ALPHA_TEST
, etglAlphaFunc
.la source
Le test alpha est utilisé pour arrêter le rendu des pixels de dessin vers n'importe quel tampon, y compris le tampon z. Le mélange alpha est juste une chose visuelle - les valeurs sont toujours écrites dans le zbuffer, ce qui peut entraîner des problèmes comme celui-ci - les pixels invisibles sont devant les pixels rendus par la suite, ce qui signifie qu'ils échoueront au test z lorsque vous dessinerez les nouveaux pixels. C'est ce que vous pouvez voir dans l'image que vous avez donnée, un échec de ztest.
La désactivation de l'écriture z atteindra également les mêmes fins, mais vous devez vous assurer de tout remettre dans l'ordre avant. Cela devrait être assez facile à faire dans votre jeu isométrique.
la source