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 :

Textures avec transparence


Sujet :

OpenGL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut Textures avec transparence
    Bonjour,
    J'utilise dans mon application Python des textures .png ( mode RVBA ) pour pouvoir jouer avec la transparence de celle-ci grâce au blending. J'ai réussi à trouver les bonnes configuration pour que l'affichage soit correct mais je me suis rendu compte que les textures rendues étaient monochrome même si l'original est en couleur. Cette couleur est définie par le dernier appelle de la fonction glColor, or je voudrais récupérer mes couleurs originales.
    Est-ce possible ???
    Si oui, qu'est-ce qui peut faire que le programme ne récupère pas ces couleurs ???

    Paramètres du contexte OpenGL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)
    Définition de la texture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    image = Image.open(texture)
    ix = image.size[0]
    iy = image.size[1]
    image = image.tostring()
     
    glPixelStorei(GL_UNPACK_ALIGNMENT,1)
    glTexImage2D(GL_TEXTURE_2D, 0, 4, ix, iy, 0, GL_RBA, GL_UNSIGNED_BYTE, image)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    Affichage de 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
    glEnable(GL_TEXTURE_2D)
    glEnable(GL_BLEND)
    glDisable(GL_DEPTH_TEST)
    glPushMatrix()
     
    glTranslated(coord[0],coord[1],0)
     
    glColor3f(couleur[0],couleur[1],couleur[2])
     
    glBegin(GL_QUADS)
    glTexCoord2f(0.0, 0.0)
    glVertex3f(-taille_x, -taille_y, 0)
    glTexCoord2f(1.0, 0.0)
    glVertex3f( taille_x, -taille_y, 0)
    glTexCoord2f(1.0, 1.0)
    glVertex3f( taille_x,  taille_y, 0)
    glTexCoord2f(0.0, 1.0)
    glVertex3f(-taille_x,  taille_y, 0)
    glEnd()
     
    glPopMatrix()
    glDisable(GL_TEXTURE_2D)
    glDisable(GL_BLEND)
    glEnable(GL_DEPTH_TEST)
    Merci

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 537
    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 537
    Points : 5 222
    Points
    5 222
    Par défaut
    Salut,
    je pense que le coupable est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)
    essaies de remplacer GL_BLEND par GL_MODULATE

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Le problème ne vient pas de là. En effet avec GL_DECAL j'ai les couleurs mais pas la transparence et avec GL_BLEND et GL_MODULATE j'ai la transparence mais plus les bonnes couleurs (j'ai vu une différence entre les 2 p/r à la couleur rendu càd celle du dernier glColor mais c'est tout)

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 537
    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 537
    Points : 5 222
    Points
    5 222
    Par défaut
    je ne suis pas certain que ça y change quelque chose mais les paramètres de texture sont peut-etre mal pris en compte

    il y a une chose à laquelle je n'ai jamais trouvé de réponse écrite
    et j'avoue ne pas avoir fait de tests non plus

    je m'explique :
    pour générer une texture il faut faire au minimum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -glBindTexture
    -glTexImage2D
    mais si on met un glTexParameter entre les deux, je me demande si celui-ci n'est pas mémorisé dans la déclaration de la texture par OpenGL
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -glBindTexture(1)
    -glTexParameteri(GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    -glTexImage2D(...)
     
    -glBindTexture(2)
    -glTexParameteri(GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    -glTexImage2D(...)
    la texture 1 ne sera pas filtrée, la 2 par contre le sera, et ce sans avoir à rappeler glTexParameter

    auquel cas l'appel à glTexEnvf doit être fait au bon moment
    normalement après le glBindTexture soit à la génération soit à l'utilisation

    si ton problème persiste malgrès ces ajustements c'est qu'il y a autre chose qui perturbe ton rendu et il faudrait voir ce qui rentre en compte dans ton rendu

  5. #5
    Expert éminent sénior

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexImage2D(GL_TEXTURE_2D, 0, 4, ix, iy, 0, GL_RBA, GL_UNSIGNED_BYTE, image)
    Je ne me souviens plus trop comment fonctionne Python mais à mon avis utiliser GL_RBA à la place de GL_RGBA ne doit pas trop lui plaire si?

    Ou est-ce une erreur de copie?

    Jc

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Désolé pour le GL_RBA il fallait lire GL_RGBA (c'était bien une erreur de copie)

    Pour ce qui est de glTexEnvf il affecte l'environnement de toutes les textures, si on a un seul type de texture, on peut donc le déclarer directement dans les paramètres de OpenGL sinon il faudra le faire avant le placage de chaque texture (j'ai eut ce problème hier alors g fait qq tests).

    glTexParameter lui n'affecte que la texture courante, il est comme tu le dis mémorisé dans la déclaration de la texture par OpenGL.

    Sinon tu as (peut-être) remarqué que je n'utilise pas de glBindTexture, c'est parce que (pour l'instant) je genere la texture a chaque fois que je l'affiche, je n'ai donc pas besoin de dire a quel id la texture que je déclare correspond.

  7. #7
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 537
    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 537
    Points : 5 222
    Points
    5 222
    Par défaut
    Citation Envoyé par Corpio
    Sinon tu as (peut-être) remarqué que je n'utilise pas de glBindTexture, c'est parce que (pour l'instant) je genere la texture a chaque fois que je l'affiche, je n'ai donc pas besoin de dire a quel id la texture que je déclare correspond.
    Tu n'as aucun appel à glBindTexture ?
    je t'avoue que je ne savais pas que c'était possible

    merci pour les précisions concernant glTexEnv et glTexParameters

    par contre, tout ça ne résoud pas ton problème et je t'avoue que je ne vois pas ce qui peut provoque ce rendu dans le code que tu montres

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    LOL ravis de tavoir aidé !!

    Peut-être que c'est normal que le code que j'ai indiqué m'affiche ma texture avec une seule couleur, le problème c'est que je ne sais pas si c'est çà ou si c'est autre chose dans mon code qui fait planter (bien que je croit que c'est la première idée la bonne).

    Que faudrait-il alors modifier ou ajouter pour pouvoir récupérer les bonnes couleurs ???

    Si qqun a déjà utilisé des textures en couleurs et avec de la transparence je veux bien de son aide (même si il faut que je change une partie de mon code, de toute façon si il est faut ...)

    Merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Il fallait remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
    Je croyait qu'il n'y avait que GL_DECAL, GL_BLEND et GL_MODULATE et bien non il y a aussi GL_REPLACE (le seul que je savais pas et c'est celui_là qu'il fallait )

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

Discussions similaires

  1. Texture avec trous transparent
    Par Davidlouiz dans le forum OpenGL
    Réponses: 5
    Dernier message: 14/03/2011, 15h32
  2. Réponses: 10
    Dernier message: 07/11/2006, 11h45
  3. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 17h42
  4. chargement de texture avec la SDL
    Par Fry dans le forum OpenGL
    Réponses: 7
    Dernier message: 27/05/2004, 16h31
  5. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 16h20

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