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 :

Objet devient transparent si clearColor avec alpha


Sujet :

OpenGL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Objet devient transparent si clearColor avec alpha
    Bonjour,

    tout d'abord désolée pour ce titre étrange mais je ne savais pas comment résumer mon problème. Je vais tâcher de l'expliquer mieux :

    J'ai un objet que je souhaite dessiner sur un fond transparent, le but étant de faire du render-to-texture, puis de générer un flou gaussien sur cette texture via les shaders, et enfin faire un blending avec un quad texturé en background (j'espère que j'ai été claire )
    En gros je veux flouter un objet, puis le superposer à une image.

    Le problème, c'est que le background sort bien transparent, mais l'objet aussi ! J'ai testé la valeur alpha de chacun des pixels, et je me retrouve avec :

    - 0 quand c'est le le fond (jusque là, logique...)
    - 85 ou 170 quand c'est mon objet (et là, c'est le drame... il devrait être opaque ! )

    Etant donné que les objets sont chargés depuis des fichiers .obj, j'ai même tenté de forcer l'opacité à 1 à la lecture du fichier.... voilà le morceau de code que j'utilise :


    Ah oui, petite précision, je suis en Java et je bosse donc avec JOGL, mais ça ne fait pas grand changement...
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    		gl.glPushAttrib(0xffffffff);
     
     
    		gl.glClearColor(0, 0, 0, 0);
     
    		gl.glViewport(0, 0, _width * 2, _height * 2);
     
    		gl.glMatrixMode(GL2.GL_MODELVIEW);
     
    		gl.glLoadIdentity();
     
    		gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, _frameBuffer.get(0));
     
    		gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
     
    		gl.glPushMatrix();
     
    		gl.glTranslated(0, 0, - _position);
     
    		gl.glRotated(_rotaX, 1, 0, 0);
    		gl.glRotated(_rotaY, 0, 1, 0);
    		gl.glRotated(_rotaZ, 0, 0, 1);
     
     
    		gl.glScaled(_scale, _scale, _scale);
    		gl.glScaled(2 / _norm.max(), 2 / _norm.max(), 2 / _norm.max());
    		gl.glTranslated(-_centre.x, -_centre.y, -_centre.z);
     
    		try
    		{
    			gl.glCallList(glListId);
    		}
    		catch (RuntimeException e)
    		{
    			e.printStackTrace();
    		}
     
    		gl.glPopMatrix();
     
     
    		if(i == 0)
    		{
    			BufferedImage img = screenShot(gl, 0, 0, _width, _height);
     
    			try
    			{
    				ImageIO.write(img, "png", new File("/elo/test.png"));
    			}
    			catch (IOException e)
    			{
    				e.printStackTrace();
    			}
    		}	
     
     
     
    		gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0); // unbind
     
    		gl.glPopAttrib();

    Et ma fonction sur laquelle je teste les valeurs alpha :

    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
    22
    23
    24
     
    	public BufferedImage screenShot(GL2 gl, int startX, int startY, int width2, int height2)
    	   {		
    			int width = width2 * 2;
    			int height = height2 * 2;
    	        gl.glReadBuffer(GL2.GL_FRONT);    
    	        ByteBuffer buffer = ByteBuffer.allocateDirect((width * height * 4));
    	        gl.glReadPixels(startX, startY, width, height, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, buffer);
    	        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
    	         for (int x = 0; x <  width; x++) {
    	            for (int y = 0; y < height; y++) {
    	              int i = (x + ( width * y)) * 4;
    	              int r = buffer.get(i) & 0xff;
    	              int g = buffer.get(i + 1) & 0xff ;
    	              int b = buffer.get(i + 2) & 0xff ;
    	              int a = buffer.get(i + 3) & 0xff;
     
    	              if(r > 0)
    	               image.setRGB(x, height - (y + 1), ( a << 24) | (r << 16) | (g << 8) |b );
    	            }
    	         }
     
    	        return image;
    	   }

    J'espère vraiment que quelqu'un pourra m'aiguiller....
    Et désolée pour le code un peu sale, 15 jours que je suis là dessus je n'en peux plus de faire des tests ...!!

    Merci d'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Bonjour,

    J'utilise personnellement un profil très réduit d'OpenGL, tiré de la version 1.3 et je code en C donc je vais peut-être dire une bêtise mais je vois rien concernant les fonctions de mélange de couleurs selon le paramètres alpha justement (pour vous l'équivalent du glBlendFunc). Si c'est bien un oubli et si ce n'est pas activé là où je ne le verrais pas, il faut également activer ces tests de blending.

    Du reste si je réponds à coté, veuillez m'en excuser

    -Omalab

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Nom : avion2.png
Affichages : 118
Taille : 24,6 Ko

    Peut-être qu'une image sera plus parlante que mon explication un peu bancale !

    En gros voilà ce que ça donne si je charge un avion, on voit bien que le background est transparent, mais l'avion l'est malheureusement aussi.

    Et en ce qui concerne le blending, effectivement il n'y en a aucun à ce niveau là. Je souhaite juste dessiner mon objet avec un glClearColor transparent. Alors je ne sais pas s'il faut que j'active quand même quelque chose ?

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Vu l'image que vous présentez, le color blending doit être activé, sinon l'objet ne serait pas affiché avec une certaine transparence. Si j'ai bien compris ce que vous désirez faire, l'erreur ne vient pas de là, mais plutôt de la composante alpha de votre objet qui doit être différente du maximum (opaque), dans votre cas de 0xFF. Pouvez vous le vérifiez et nous dire ce qu'il en est?

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je pense que cet outil pourra vous aider : http://www.andersriggelsen.dk/glblendfunc.php
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Effectivement en utlisant ma fonction postée plus haut, j'ai des valeurs d'alpha 0xAA qui sortent pour mon objet. Or je ne comprends pas, puisque je force la composante alpha à 0xFF à la lecture du fichier .obj qui décrit mon avion.

    Merci pour l'outil que je connais déjà. Il est vrai que je n'en avais pas saisi l'interet, car je pensais qu'en utilisant uniquement un glClearColor(0,0,0,0) et en dessinant mon objet, il n'y avait pas besoin de blending, et j'ai l'air de comprendre que ce n'est pas le cas...!

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    En gros si le blending n'est pas activé, il n'est pas possible de faire de la transparence par comparaison de la composante alpha. Dans votre cas il semble bien activé.

    Le fait que la composante alpha de votre objet une fois rendu soit la moyenne de la source et du destinataire (dit autrement de l'objet et du fond) laisse présager que la fonction de blending est erronée pour l'effet que vous recherchez.Essayez de la récupérer, il serait étonnant que sa valeur par défaut donne le résultat que vous nous avez montré donc une des fonction que vous utilisez doit surement la modifier.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Pourtant je n'ai activé nulle part le blending...c'est ça que je ne comprend pas ! je viens de revérifier partout !

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Je ne suis pas certains du fonctionnement du blending avec les shaders et ce n'est pas du tout mon domaine.

    La dernière chose que je pourrais vous conseiller est de vérifier qu'en entrée votre objet (l'avion) a bien une composante alpha de 0XFF et que c'est uniquement une fois rendu à l'écran que la composante alpha du pixel destinataire prend une valeur différente.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ce conseil, je pense avoir trouvé la source du problème :
    mon objet est donc issu d'un fichier .obj accompagné d'un fichier .mtl, dans lequel plusieurs textures sont définies pour un même matériau. Je fais donc du multitexturing, et c'est a priori à l'issu de ce multitexturing que mes valeurs d'alpha changent, et ne sont plus à 0xFF. Reste à trouver pourquoi, et comment le corriger.

    Merci en tout cas !

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Corruption de mémoire ?
    Sous Linux, utilisez valgrind ou Dr Memory pour Windows
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé en fin de matinée d'où vient ce changement de valeur et j'ai honte...
    J'ajoutais dans un shader les composantes RGBA des textures, et divisait par le nombre de textures...donc si une des textures ne possédait pas de canal alpha, je divisais par 3 en l'occurence, alors que la valeur d'alpha était de 2... d'où la valeur 0xAA qui pour moi sortait de nulle part...! Il ne me reste plus qu'à m'attaquer à mon problème suivant !

    Encore merci pour votre temps et désolée

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Bon courage pour la suite.

    -Omalab

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

Discussions similaires

  1. Réponses: 28
    Dernier message: 29/12/2011, 19h24
  2. [FLASH 8] Faire disparaitre du texte avec alpha
    Par steeves5 dans le forum Flash
    Réponses: 6
    Dernier message: 08/06/2006, 15h47
  3. Objet d'un type initialisé avec un autre type.
    Par Pragmateek dans le forum C++
    Réponses: 28
    Dernier message: 30/03/2006, 20h06
  4. Transparence autre qu'avec le noir...
    Par Ptibibi dans le forum DirectX
    Réponses: 11
    Dernier message: 07/06/2004, 18h13

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