iPhone OpenGL ES: L'application d'un test de profondeur sur les textures qui ont des pixels transparents pour le jeu 2D

StackOverflow https://stackoverflow.com/questions/1320399

Question

À l'heure actuelle, j'ai le mélange et le test de profondeur pour tourner sur un jeu en 2D. Quand je dessine mes textures, la texture « supérieure » enlever une partie des textures inférieures si elles se croisent. De toute évidence, les pixels transparents des textures sont prises en compte de l'essai de profondeur, et clairement toutes les couleurs des textures inférieures tirées si elles se croisent. De plus, les alpha assemblages ne sont pas correctement rendus. Y a-t-il une sorte de fonctions qui peuvent dire OpenGL de ne pas inclure les pixels transparents dans le test de profondeur?

Était-ce utile?

La solution

Non, ce n'est pas possible. Cela est vrai de tous les essais en profondeur du matériel.

GL (complet ou ES - et D3D) ont tous le même modèle - ils peignent dans l'ordre que vous spécifiez des polygones. Si vous dessinez le polygone A avant polygone B, et le polygone logique A devrait être devant le polygone B, polygone B ne sera pas peint (avec l'aimable autorisation de l'essai de profondeur).

La solution est de vous dessiner des polygones afin de le plus à l'origine le plus proche de la vue actuelle. Heureusement dans un jeu 2D cela devrait juste être une sorte simple (celui que vous aurez probablement même pas besoin de faire très souvent).

Dans les jeux 3D sont BSPs la solution de base à cette question.

Autres conseils

glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );

Ceci annule tous les pixels avec un alpha de quoi que ce soit autre que complètement opaque. Ces pixels seront donc pas rendus à la Z-tampon. Cela ne concernent toutefois divers pipelines Z-Buffer Optimisations il peut causer des ralentissements graves. Ne l'utilisez que si vous vraiment ont aussi.

si vous utilisez shaders, pouvez essayer de désactiver le mélange et éliminer les pixels avec alpha 0

if(texColor.w == 0.0)
    discard;

Quel type de mélange utilisez-vous?

glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

devrait empêcher tout fragment alpha de 0 à partir de l'écriture dans le tampon de profondeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top