IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

blending... finalement... (ou pas)


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par défaut blending... finalement... (ou pas)
    salut,

    bon je sais pas si ca concerne vraiment le multi texturing, i me semble en tt cas.

    donc voila, je suis en train de developper un petit jeu en 2d (vue de haut) type zelda.

    Et le probleme auquel je suis confronte est le suivant :

    apres avoir dessine la carte du jeu (juste une texture d'herbe pour le moment), je veux rajouter la texture representant le personnage.

    cette texture est au format png avec un fond transparent.

    Or, a l'execution, mon personnage s'affiche bien mais le fond de la texture, soi-disant transparent, apparait en blanc et cache donc la texture d'herbe.

    et donc, je voudrais que ce fond transparent le soit vraiment sans avoir a jouer avec l'alpha parce que je n'ai pas envie de voir a travers mon personnage.

    Pour le moment, je fais ca mais a priori c pas bon.

    voila l'init d'OpenGL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public void init(GLAutoDrawable drawable) {
            GL gl = drawable.getGL();
     
            gl.glEnable(GL.GL_TEXTURE_2D);                              // Enable Texture Mapping
            gl.glShadeModel(GL.GL_SMOOTH);                              // Enable Smooth Shading
            gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);                    // Black Background
            gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);  // Really Nice Perspective Calculations
     
            gl.glAlphaFunc(GL.GL_GREATER, 0.0f);
            gl.glEnable(GL.GL_ALPHA_TEST);
     
    		gl.glClearDepth(1.0);									//Enable Clearing of the Depth buffer
    		gl.glDepthFunc(GL.GL_LEQUAL);							//Type of Depth test
    		gl.glEnable(GL.GL_DEPTH_TEST);							//Enable Depth Testing
            LoadGLTextures(gl);
        }
    et voila la methode display

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public void display(GLAutoDrawable drawable) {
     
            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
            gl.glLoadIdentity();   
            gl.glTranslatef(x_axe, y_axe, profondeur_);
            gl.glBindTexture(GL.GL_TEXTURE_2D, textures[1]);
    	       gl.glEnable(GL.GL_BLEND);
    	gl.glBegin(GL.GL_QUADS);	
    	   	/*...*/	       
     gl.glEnd();	        	
     
     
            gl.glBlendFunc(GL.GL_DST_ALPHA, GL.GL_ONE_MINUS_DST_ALPHA);	
            gl.glDisable(GL.GL_BLEND);			// Disable Blending
        }
    j'espere que vous pourrez m'eclairer parce que ca fait 2 jours que je suis la dessus.

    merci d'avance
    a plouche

    PS : j'ai vu qu'il y avait des posts concernant des pbs similaires sur ce forum, je les ai mm lu, mais aucun ne m'a permis de regler mon souci. (je precise pour pas me faire incendier )

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Première chose à faire, il faut que tu charges correctement le canal alpha de ta texture. Est-ce que c'est OK ?

    Ensuite tu as deux options : utiliser l'alpha-blending, ou utiliser l'alpha-test. La seconde option est légèrement plus appropriée, voilà comment faire (syntaxe C++) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.0f);
    // Dessin de ton personnage
    glDisable(GL_ALPHA_TEST);
    Ainsi tous les pixels ayant une transparence totale (0) seront rejetés.

    Pour l'alpha-blending, ce que tu fais es presque correct, si ce n'est qu'il vaut mieux l'initialiser avant de dessiner ton perso, et il faut prendre l'alpha de la source, non de la destination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
    PS : cela n'a rien à voir avec le multi-texturing

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par défaut
    salut,

    merci pour ta reponse et d'apres ce que tu me dis,
    je pense que ca doit venir du fait que je ne charge pas bien (voir pas du tout) le canal alpha...

    maintenant mon pb est :
    comment faire pour (bien) charger ce fameux canal alpha

    voila ma methode pour loader les textures (simplifiée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    private void LoadGLTextures(GL gl) 
    {                                   
     // Load Bitmaps And Convert To Textures
            TextureReader.Texture texture = null;
     
            try {
                texture = TextureReader.readTexture("data/images/perso.png");
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
            gl.glGenTextures(1, textures, 0);  
     
            // Create Linear Filtered Texture
            gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0]);
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
            gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 3, texture.getWidth(), texture.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels());
     
        }
    de plus, comme tu me parles de charger le canal alpha, j'imagine que mon erreur se situe dans l'appel a la methode gtTexImage2D puisque j'utilise GL_RGB et non pas GL_RGBA. Mais le probleme est que lorsque j'utilise GL_RGBA, et bah.... erreur de compil.

    Donc soit c'est ca et j'espere qu'il y a une jolie astuce qui m'attend bien au chaud pour que ca ne me pete plus d'erreur a la compil,
    soit je n'appele pas les bonnes methodes,
    soit je ne passe pas les bons parametres,
    soit je n'appele pas toutes les methodes necessaires...

    en tout cas, quelque soit le probleme, je te remercie d'avoir repondu aussi vite... ca fait plaisir

    parce que la, j'ai mon perso qui se balade sur la map avec ce cadre blanc qui l'entoure et qui commence legerement a me rendre dingue...

    voili voilou
    merci d'avance
    a+

    PS : lol je men doutais... en fait j'hesitais a mettre ca ou blending ... par contre si tu me dis que c pas non plus du blending... la je vais me desinscrire du forum et ne plus remettre les pieds sur le net...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faut déjà voir si ta fonction TextureReader.readTexture charge bien le canal alpha des fichiers .tga.

    Ensuite, quel genre d'erreur tu as avec GL_RGBA ? C'est bizarre.

    Enfin, ce paramètre spécifie le format des données sources, il faut également spécifier que tu veux un canal alpha dans la texture que tu crées, en remplaçant 3 par 4 en tant que 3ème paramètre de glTexImage2D.

    PS : si on utilise l'alpha-test ce n'est pas vraiment du blending, en fait c'est juste une histoire de transparence et de gestion de l'alpha

  5. #5
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    a priori tu charge bien la texture sauf qu'il faut effectivement utiliser GL_RGBA pour avoir un canal alpha.
    sinon, pour l'affichage, dans ton cas c'est bien de l'alpha test qu'il faut utiliser, mais, si tu veut que ca tourne sur les carte ATI, il faut aussi activer l'alpha blending (oui, ca n'a aucun sens mais c'est comme ca l'openGL version ATI )
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par bafman
    sinon, pour l'affichage, dans ton cas c'est bien de l'alpha test qu'il faut utiliser, mais, si tu veut que ca tourne sur les carte ATI, il faut aussi activer l'alpha blending (oui, ca n'a aucun sens mais c'est comme ca l'openGL version ATI )
    Sérieux ? Toutes cartes confondues, ou seulement une série particulière ?
    J'y crois pas qu'ils arrivent à mettre le boxon sur une fonctionnalité aussi basique

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par bafman
    a priori tu charge bien la texture sauf qu'il faut effectivement utiliser GL_RGBA pour avoir un canal alpha.
    sinon, pour l'affichage, dans ton cas c'est bien de l'alpha test qu'il faut utiliser, mais, si tu veut que ca tourne sur les carte ATI, il faut aussi activer l'alpha blending (oui, ca n'a aucun sens mais c'est comme ca l'openGL version ATI )
    Hmm, t'es sûr, j'ai une radeon 7600 et ce n'est pas mon cas. J'utilise uniquement GL_ALPHA_TEST et pas l'alpha blending...

    Jc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/11/2009, 13h51
  2. Blend / VS 2008 / MVVM : pas bon menage pour binding
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 09/04/2009, 08h19
  3. lorsque je ferme une JFrame, la methode finalize implementée ne s'enclenche pas.
    Par javanoiid dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 28/03/2008, 10h41
  4. [Blend beta 1][VS Extension WPF CTP 11/06] VS ne lit pas le code généré par Blend
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 09/12/2006, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo