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 :

OpenGL problème avec transparence


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut OpenGL problème avec transparence
    Bonjour,

    voilà je réalise un rendu d'image 3D. Mes images n'ont pas des tailles qui font pile un puissance de 2 (ex : 64*512*256)... par exemple j'en ai une qui fait 63*296*256 donc je complète par du transparent. Dans le code largeurPuiss2 vaut 512 car ma largeur réelle est de 296... je complète le reste (297 -> 512) avec des pixel ayant un alpha de 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,largeurPuiss2,profondeurPuiss2,0,GL_RGBA,GL_UNSIGNED_BYTE,textureY);	
    		glBegin( GL_QUADS );
    		glTexCoord2f(0.0f,0.0f);glVertex3f(-halfImage,iY-halfImage,-halfImage);
    		glTexCoord2f(1.0f,0.0f);glVertex3f(+halfImage,iY-halfImage,-halfImage);
    		glTexCoord2f(1.0f,1.0f);glVertex3f(+halfImage,iY-halfImage,+halfImage);
    		glTexCoord2f(0.0f,1.0f);glVertex3f(-halfImage,iY-halfImage,+halfImage);
    		glEnd();
    J'ai un problème d'affichage : je dessine d'abord ma coupe X puis Y puis Z, j'arrive à voir X et Y à travers le transparent de Z. Mais je n'arrive qu'à voir X à travers le transparent de Y (quand ma coupe Y passe au dessus de Z, le "transparent" recouvre Z)... et je ne voit aucune coupe à travers le transparent de X !
    comme si X serait prioritaire à Y et Z. et Y prioritaire à Z...

    comment puis-je faire pour que le transparent soit vraiment transparent à tout moment?

    désolé si je ne suis pas clair mais c'est assez difficile de décrire

  2. #2
    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
    Une capture d'écran ( avec des explications dessus ) , car j'avoue mais j'ai pas tout saisi :s
    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.

  3. #3
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Si j'ai bien saisi ce que tu cherches à faire, je pense que ce chapitre des GPU Gems pourrait t'être utile.

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    as tu activé la transparence (blending) avec glEnable(GL_BLEND) ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Bonjour,

    je met une image (c'est assez moche désolé mais normalement ca se comprend avec le texte que j'ai mis)... Ici pour qu'on voit mieux j'ai dessiné la coupe Z puis X puis Y. Donc quand je passe Z devant X, le transparent de Z masque ma coupe X....

    au niveau de glEnable(GL_BLEND); il suffit de le mettre avant que je dessine je suppose? Là je l'ai mis avant d'appeler mes glVertex3f mais rien ne change
    Images attachées Images attachées  

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Elstak Voir le message
    au niveau de glEnable(GL_BLEND); il suffit de le mettre avant que je dessine je suppose? Là je l'ai mis avant d'appeler mes glVertex3f mais rien ne change
    En dehors de glBegin() tout de même ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    euh... tu veux dire avant? je l'ai mis avant moi... enfin j'ai essayé de le mettre un peu partout mais rien à faire ca veut pas

    apres ca vient peut etre de mon glTexImage2D, non? j'ai regardé la doc : http://www.opengl.org/sdk/docs/man/
    je vois pas trop la différence entre format et internalFormat... j'ai choisi GL_RGBA pour les deux !


    EDIT : pour l'instant j'ai juste mis du RGBA et mon alpha = 0 pour l'endroit où je veux que ce soit transparent (j'ai rien fait d'autre), j'ai jamais fait d'openGL avant donc c'est possible que j'ai oublié un truc de base ( = hésitez pas à proposer meme si ca vous semble évident )

  8. #8
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    il faudrait que tu montres un peu plus de code, la partie où tu appelles glEnable(GL_BLEND) et la section avec glBegin / glEnd entre autres
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Salut,

    Je pense que ca devrait suffire comme code?

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
           glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
    	glEnable(GL_BLEND);
    	glLoadIdentity();
     
    	switch(choixCamera)
    	{
    		case 0 :
    			glLightfv(GL_LIGHT0, GL_POSITION, camera->getLightPosition());
    			camera->look();
    			break;
    		case 1 :
    			cameraFree->look();
    			glLightfv(GL_LIGHT0, GL_POSITION, cameraFree->getLightPosition());
    			break;
    	}
     
    	//on dessine le maillage(sans la forme)
    	if(maillage!=NULL)
    		maillage->dessinerOpenGL();
     
     
     
    	//on eteint la lumiere pour afficher le repere et la texture
    	glDisable(GL_LIGHTING);
    	glEnable(GL_TEXTURE_2D);
     
            .....
     
    	//images	
    	//glDisable(GL_LIGHT0);
    	glColor3f(1.0f,1.0f,1.0f);
    	glBindTexture(GL_TEXTURE_2D,*texture);	
     
     
    	if(indZ >= 0)
    	{	
    		float iZ = indZ*sizeImage/maxPuiss2;
    		glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,largeurPuiss2,hauteurPuiss2,0,GL_RGBA,GL_UNSIGNED_BYTE,textureZ);
    		glBegin( GL_QUADS );
    		glEnable(GL_BLEND);
    		//3coord (x,y,z) du point bas gauche
    		glTexCoord2f(0.0f,1.0f);
    		glVertex3f(-halfImage,(0.5-(hauteurPuiss2/(double)maxPuiss2))*2,iZ-halfImage);
    		//bas droite
    		glTexCoord2f(1.0f,1.0f);
    		glVertex3f(((largeurPuiss2/(double)maxPuiss2)-0.5)*2,(0.5-(hauteurPuiss2/(double)maxPuiss2))*2,iZ-halfImage);
    		//haut droite
    		glTexCoord2f(1.0f,0.0f);
    		glVertex3f(((largeurPuiss2/(double)maxPuiss2)-0.5)*2,+halfImage,iZ-halfImage);
    		//haut gauche
    		glTexCoord2f(0.0f,0.0f);
    		glVertex3f(-halfImage,+halfImage,iZ-halfImage);
    		glEnd(); 
    	}
    	if(indX >= 0)
    	{	
    		//float iX = indX*sizeImage/256.0;
    		float iX = indX*sizeImage/maxPuiss2;
    		//glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,textureX);
    		glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,profondeurPuiss2,hauteurPuiss2,0,GL_RGBA,GL_UNSIGNED_BYTE,textureX);	
    		glBegin( GL_QUADS );
    		glEnable(GL_BLEND);
    		//bas droite
    		glTexCoord2f(0.0f,1.0f);
    		glVertex3f(iX-halfImage,(0.5-(hauteurPuiss2/(double)maxPuiss2))*2,-halfImage);
    		//bas gauche
    		glTexCoord2f(1.0f,1.0f);
    		glVertex3f(iX-halfImage,(0.5-(hauteurPuiss2/(double)maxPuiss2))*2,((profondeurPuiss2/(double)maxPuiss2)-0.5)*2);
    		//haut gauche
    		glTexCoord2f(1.0f,0.0f);
    		glVertex3f(iX-halfImage,+halfImage,((profondeurPuiss2/(double)maxPuiss2)-0.5)*2);
    		//haut droit
    		glTexCoord2f(0.0f,0.0f);
    		glVertex3f(iX-halfImage,+halfImage,-halfImage);
    		glEnd();
    	}
    	if(indY >= 0)
    	{	
    		//float iY = indY*sizeImage/256;
    		float iY = indY*sizeImage/maxPuiss2;
    		//glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,textureY);	
    		glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,largeurPuiss2,profondeurPuiss2,0,GL_RGBA,GL_UNSIGNED_BYTE,textureY);	
    		glBegin( GL_QUADS );
    		glEnable(GL_BLEND);
    		//bas gauche
    		glTexCoord2f(0.0f,0.0f);
    		glVertex3f(-halfImage,halfImage-iY,-halfImage);
    		//bas droite
    		glTexCoord2f(1.0f,0.0f);
    		glVertex3f(((largeurPuiss2/(double)maxPuiss2)-0.5)*2,halfImage-iY,-halfImage);
    		//haut droite
    		glTexCoord2f(1.0f,1.0f);
    		glVertex3f(((largeurPuiss2/(double)maxPuiss2)-0.5)*2,halfImage-iY,((profondeurPuiss2/(double)maxPuiss2)-0.5)*2);
    		//haut gauche
    		glTexCoord2f(0.0f,1.0f);
    		glVertex3f(-halfImage,halfImage-iY,((profondeurPuiss2/(double)maxPuiss2)-0.5)*2);
    		glEnd();
    	}
     
     
     
    	//glEnable(GL_LIGHT0);
    	glDisable(GL_TEXTURE_2D);
           glEnable(GL_LIGHTING);
           glFlush();
     
        SwapOpenGLBuffers();

  10. #10
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    déjà, trouver cela dans ton code ce n'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		glBegin( GL_QUADS );
    		glEnable(GL_BLEND);
    il y a tout de même l'activation du blend au début qui devrait se faire
    tu ne paramètres pas la transparence avec glBlendFunc ce que je te conseillerai de faire

    enfin, et ton problème est peut-etre là, pour gérer de la tranparence telle que tu veux la faire, il faut trier les polygones à afficher afin de les dessiner du plus lointain au plus près, sinon ton zbuffer va invalider les pixel derrière la transparence si les pixels transparents sont dessinés avant

    transparent ne veux pas dire que rien n'est dessiné et donc le zbuffer est mis à jour et si tu dessines les pixels transparents avant aucune chance que les pixels derrière soient dessinés à leur tour
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Euh...
    le GlBlend là en fait je l'avais ajouté pour tester (à la base il l'avait pas, le seul qu'il y avait c'est celui de ma 2eme ligne de code!).

    Là j'ai retiré ceux après les GlBegin (donc j'ai mon code initial) et ca va toujours pas (forcément)

    enfin, et ton problème est peut-etre là, pour gérer de la tranparence telle que tu veux la faire, il faut trier les polygones à afficher afin de les dessiner du plus lointain au plus près, sinon ton zbuffer va invalider les pixel derrière la transparence si les pixels transparents sont dessinés avant
    Oui ! C'est fort possible que ce soit ca... mais comment faire?

    glBlendFunc... ok je vais y jeter un oeil !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Salut,

    j'ai essayé d'utiliser glBlendFunc mais sans réussite

    sinon je veux bien essayer l'idée du zbuffer mais je suis un peu perdu là, c'est la première fois que je fais de la 3D

    EDIT : j'ai revu le glBlendFunc mais je pense pas que ca soit ca dont j'ai besoin... ou alors je m'y prend mal, mais si j'ai bien compris ca peut me mettre une coupe avec une certaine valeur de alpha etc.. mais moi il s'agit juste d'une partie (transparente) de la coupe pour laquelle je veut mettre alpha=0

    D'ailleurs voilà comment je rempli mes coupes 3D:

    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
    int z=ind*(largeur*hauteur);
     
    	for(int y = 0; y < hauteur; y++)
    	{
    		for(int x = 0; x < largeur; x++)
    		{
    			ndg=image[x+y*largeur+z];
     
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 0] = ndg;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 1] = ndg;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 2] = ndg;
    			//transparence de l'image
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 3] = 255;
    		}
    	}
    	//on remplit le reste en transparent
    	for(int y = 0; y < hauteurPuiss2; y++)
    	{
    		for(int x = largeur; x < largeurPuiss2; x++)
    		{	
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 0] = 255;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 1] = 255;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 2] = 255;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 3] = 0;
    		}
    	}
     
    	for(int y = hauteur; y < hauteurPuiss2; y++)
    	{
    		for(int x = 0; x < largeur; x++)
    		{
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 0] = 255;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 1] = 255;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 2] = 255;
    			imageGluTemp[(x * 4) + (y * largeurPuiss2 * 4) + 3] = 0;
    		}
    	}
    je fais une première boucle avec les couleur en NdG puis 2 boucles pour compléter de transparent jusqu'à la puissance de 2 supérieure (une boucle pour remplir "vers la droite" et l'autre "vers le bas")

Discussions similaires

  1. Problème de transparence avec OpenGL
    Par yann458 dans le forum OpenGL
    Réponses: 15
    Dernier message: 16/12/2011, 08h43
  2. Opengl - Problème avec les arrêtes
    Par Sawyer4 dans le forum OpenGL
    Réponses: 4
    Dernier message: 20/08/2010, 16h28
  3. [OpenGl] problème avec SDL_AddTimer
    Par Angelsafrania dans le forum SDL
    Réponses: 2
    Dernier message: 20/08/2007, 20h44
  4. [OpenGL] Problème avec glGetString
    Par djo.mos dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 17/06/2005, 11h12
  5. Réponses: 5
    Dernier message: 18/03/2005, 20h10

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