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 :

Créer une texture transparente


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut Créer une texture transparente
    Bonjour,
    J'essaye de créer une texture transparente pour le feuillage de mes arbres. Voici les instructions :
    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
     
    data = (GLuint *)calloc( 1, ((width * height)* 4 * sizeof(GLuint)) );
     
    ...
    glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
     
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    ...
    glViewport(0,0,width,height);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    ...
    glBindTexture(GL_TEXTURE_2D, texture_id);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0);
    Mon problème c'est que quand j'utilise la texture elle est sur fond noir et non transparent ... Quelqu'un sait-il pourquoi?

    Merci d'avance.

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    pour avoir une texture à trous, il faut soit activer l'alpha test, soit le blending, voir même les 2 en même temps...

  3. #3
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Désolé, mais la solution ne se trouve pas dans la FAQ !!! Je crois qu'il s'agit d'un problème de copie avec "glcopyteximage2D".

  5. #5
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ah oui tiens, j'avais loupé le glCopyTexImage2D. Il sert à quoi au juste ici ?

    Quoiqu'il en soit la réponse est bien dans la FAQ : il faut activer l'alpha-test ou l'alpha-blending si tu veux de la transparence, et s'assurer que tu aies un canal alpha correct.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Je ne crois pas mon ami, j'avais bien entendu fait les tests habituels avant de publier mon message et non, ça ne fonctionne pas et oui, j'ai testé toutes les combinaisons possibles de GL_ALPHA_TEST et GL_BLEND à tous les niveaux possible du traitement (copie / affichage) et non ça ne marche pas avec la FAQ et je te serais reconnaissant de lire un peu plus attentivement les messages avant d'ajouter un post qui fait que tout le monde pense que le problème est un problème de débutant qui n'a pas lu la FAQ et qui ne mérite donc pas de réponse.

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 536
    Points : 5 219
    Points
    5 219
    Par défaut
    inutile d'être aussi agressif et désobligeant, si tu m'avais répondu comme ça penses bien que je ne m'occuperait plus de tes posts, un peu de considération et de respect envers les autres ne fait de mal à personne

    qui plus est, tu ne réponds pas à la question de Laurent

    concernant ton problème, je plussoie Laurent, l'activation de la transparence est dans la FAQ
    si ça ne fonctionne pas, tu as soit :
    - un problème avec ta texture, la couche alpha n'est pas bonne (tu peux mettre l'image en pièce jointe si tu veux)
    - une erreur dans tes paramètres glBlendFunc (que tu n'as pas forcément vue)
    - les deux

    qui plus est, dans le code que tu as posté, il n'y a rien qui active l'alpha test ou la transparence
    donc si le problème vient de là, ça va être dur de t'aider

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Cela peut t'aider :
    Il y a un Pong fait en OpenGL & SDL où il est question de faire disparaître les pixels d'une certaine couleur en mettant le canal alpha à 0 ou 255 ( 4ème composante RGB[A] du pixel )

    lien:
    http://fearyourself.developpez.com/tutoriel/sdl/pong/

    En espérant que celà t'ai aidé,
    Sébastien.

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Essaye de faire un test sur un mini programme pour reproduire le problème.
    Sinon j'ai lu ton post, et c'est dur de t'aider, il manque une grosse partie du code utilise sûrement à la résolution du problème.

    Tu dois bien comprendre ton problème, mais d'un point de vu extérieur, on est pas forcément au courant de ce que tu souhaites faire et comment...

    Ah oui tiens, j'avais loupé le glCopyTexImage2D. Il sert à quoi au juste ici ?
    Et cela serait bien de bien lire le post des personnes bénévoles qui essaye de t'aider pour pas un rond !!

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Merci pour toutes ces réponses, entre temps je m'étais penché sur autre chose, ... il faut dire qu'il y a beaucoup à faire ... J'essayerai prochainement de résoudre le problème.

    Le troisième screenshot sur cet page :
    http://www.medieval-fantasy-exp.com/...s_d_ecran.html

    montre bien le problème : je génère cette branche et après, je souhaiterais m'en servir comme texture transparente pour faire un arbre.

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    comme le dit cyber_n, dans ton cas, si l'image de la feuille ne contient pas déjà une couche alpha, il va falloir parcourir chaque pixel, et si il est noir (ou d'une autre couleur de fond que tu choisi), il faut mettre l'alpha à 0, et pour les autres couleurs, le mettre à 1

  12. #12
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Salut,

    A mon avis, si tu veux faire un foret par exemple, contentes-toi de l'alpha-test, car utiliser du blending me semble trop gourmand, de plus, les feuilles de arbres ne sont pas à moitié transparentes à ce que je sache
    Soit il y a le pixel d'une feuille, soit il n'y en a pas.

    Mais si tu tiens quand même à utiliser le blending, il existe une technique pour rendre des objets semi-transparents sans avoir à les trier du plus lointain au plus proche, d'ailleurs cette technique pose un problème quand deux polygones se croisent par exemple.
    Pour rendre assé bien tes objets semi-transparents, il faut que tu utilises le tampon de profondeur.

    -> désactivation du blending
    -> dessin des objets 100% opaques
    -> activation du blending
    -> désactivation de l'écriture dans le z-buffer
    -> dessin des objets semi-transaprents

    En esperant t'avoir aidé. (et désolé si cette technique a déjà été citée dans les posts précédent, je n'ai pas pris la peine de les lire)

    A+

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    cette solution ne resoud absolument pas les prblèmes d'ordre d'affichage des faces

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Le screenshot avait bougé : il s'agit bien de celui de l'éditeur de végétaux (branche sur fond noir). Actuellement je fais un screenshot de cette branche et je suis obligé de détourer avec mon logiciel de graphisme (gimp) puis de recharger dans le jeu. En effet, malgé l'activation de toutes les options connues, ce n'est pas moi qui génère le fond noir derrière la texture et je ne peux pas m'en débarasser.

    Utiliser the gimp fait perdre pas mal de temps et surtout, au moindre changement, il faut tout recommencer et je voudrais aussi utiliser la même technique pour faire des modèles simplifiés affichés au loin.

  15. #15
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par bafman
    cette solution ne resoud absolument pas les prblèmes d'ordre d'affichage des faces
    Je n'ai jamais testé personnellement.
    As-tu une déscription ou une image de l'effet obtenu ?
    Sinon j'essayerai moi-même à l'occasion.

  16. #16
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Yno
    Je n'ai jamais testé personnellement.
    As-tu une déscription ou une image de l'effet obtenu ?
    Sinon j'essayerai moi-même à l'occasion.
    Si on retire les phases évidentes du rendu, ta "solution" se résume à :
    -> désactivation de l'écriture dans le z-buffer
    Ce qui aura pour effet d'avoir un ordre non pas basé sur la profondeur, mais sur l'ordre d'affichage ; ce qui ne résoud pas grand chose.

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 536
    Points : 5 219
    Points
    5 219
    Par défaut
    Citation Envoyé par nicoenz
    Actuellement je fais un screenshot de cette branche et je suis obligé de détourer avec mon logiciel de graphisme (gimp) puis de recharger dans le jeu. En effet, malgé l'activation de toutes les options connues, ce n'est pas moi qui génère le fond noir derrière la texture et je ne peux pas m'en débarasser.
    si je comprend bien, tu crées une couche alpha avec Gimp ?
    auquel cas tu pourrais très bien faire une routine qui le fait automatiquement

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Dans the Gimp, j'ajoute une couche alpha et je supprimer le fond noir. Effectivement je pourrais automatiser ça s'il n'y a pas d'autre solution, mais ça m'étonne quand même (et ça n'est pas une solution très élégante, lol).

    A mon avis, le problème est dû aux infos que je copie dans la texture avec glcopyteximage2D : il faudrait pouvoir tout copier, sauf le fond, ...

    (Les commentaires sur le style du code sont également les bienvenus.)

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Voici la classe pour la texture :
    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
     
    GLuint MFEAlterableTexture::Create(unsigned int width, unsigned int height)
     
    {
    	this->width = width;
    	this->height = height;
     
     
    	unsigned int* data;
     
    	data = (GLuint *)calloc( 1, ((width * height)* 4 * sizeof(GLuint)) );
     
    //	ZeroMemory(data,((width * height)* 4 * sizeof(unsigned int)))
     
     
    	glGenTextures(1, &texture_id);
     
    	glBindTexture(GL_TEXTURE_2D, texture_id);
     
    	glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,		GL_RGBA, GL_UNSIGNED_BYTE, data);
     
    	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
     
    	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
     
    	free( data );
     
    	return texture_id;
     
    }
     
    void MFEAlterableTexture::startRendering()
    {
    	glViewport(0,0,width,height);
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClear(GL_COLOR_BUFFER_BIT);
     
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.001f,50.0f);
     
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
    }
     
    void MFEAlterableTexture::stopRendering()
    {
    //	glEnable(GL_ALPHA_TEST);
    //	glAlphaFunc(GL_EQUAL, 1);
    	glBindTexture(GL_TEXTURE_2D, texture_id);
    	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0);
    //	glDisable(GL_ALPHA_TEST);
     
    	glViewport(0, 0, 1024, 768);
    }

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Points : 34
    Points
    34
    Par défaut
    Là, je dessine dedans :
    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
     
    		glAlphaFunc(GL_GREATER, 0.1f);
    		glEnable(GL_ALPHA_TEST);
    		glEnable(GL_BLEND);		
    		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    		preview_texture->startRendering();
    		glTranslatef(0.0f,1.4f,-4.0f);
    		glRotatef(180.0f,0.0f,0.0f,1.0f);
     
    		float ax, ay;
    		sscanf(tf_prv_ax->buffer.c_str(),"%f",&ax);
    		sscanf(tf_prv_ay->buffer.c_str(),"%f",&ay);
     
    		glRotatef(ax,1.0f,0.0f,0.0f);
    		glRotatef(ay,0.0f,1.0f,0.0f);
     
     
    		tempMod->Render(MFE_RND_MD_RENDER);
    		glDisable(GL_BLEND);
    		glDisable(GL_ALPHA_TEST);
     
    		preview_texture->stopRendering();

Discussions similaires

  1. Créer une texture à la volée
    Par Greatmangaka dans le forum XNA/Monogame
    Réponses: 3
    Dernier message: 08/03/2013, 15h35
  2. Créer une texture 2D "animée" ?
    Par Elriks dans le forum C
    Réponses: 4
    Dernier message: 10/11/2011, 11h43
  3. Chargement d'image pour créer une texture
    Par sir_gcc dans le forum OpenGL
    Réponses: 2
    Dernier message: 29/12/2008, 23h49
  4. Créer une fenêtre transparente
    Par calving dans le forum Linux
    Réponses: 5
    Dernier message: 19/11/2008, 20h23
  5. Réponses: 5
    Dernier message: 09/11/2006, 11h36

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