Comment utiliser les tests de profondeur et la transparence des textures ensemble dans mon monde 2.5D?

11

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_TESTet GL_BLENDensemble, 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).

problème de chevauchement de transparence

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?

Nick Bolton
la source
2
Juste un commentaire pour vous dire que je suis allé exactement de la même manière que vous pour mon moteur 2D: d'abord essayer d'être intelligent et trier les Z moi-même, puis réaliser qu'il n'y avait aucune raison pour que la scène soit plate, donnant ainsi à mes tuiles une Coordonnée Z et activation du test alpha. Je ne sais pas si vous avez raison, mais vous n'êtes pas seul :-)
sam hocevar

Réponses:

7

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

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
    // ...
}

Notez l'utilisation de GL_ALPHA_TEST, et glAlphaFunc.

Nick Bolton
la source
Cela a également résolu mon problème. Merci d'avoir partagé. Tu es génial
Mathlover
2

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.

Luther
la source
1
Je pense que dessiner des trucs d'arrière en avant n'est facile dans un jeu iso 2D que lorsque vous avez un plan Y fixe, et que le concepteur a le contrôle total du monde. Cependant, lorsque des éléments peuvent exister n'importe où dans l'espace 3D et que vous autorisez l'utilisateur à les modifier, cela devient plus compliqué. Je pense que l'utilisation du tampon de profondeur me facilitera beaucoup la vie.
Nick Bolton