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 :

Texture non rectangulaire


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut Texture non rectangulaire
    Bonjour à tous,
    Je suis légèrement newbie en OpenGL avec les textures et j'ai un petit souci :

    j'ai un bitmap d'arbre 2D sur fond noir (ça peut être un fond blanc peu importe) et je souhaite superposer mon arbre à l'écran, par dessus un terrain déjà dessiné. Problème : je veux que les pixels du fond (noirs) n'apparaissent pas !
    Comment faire ?

    J'ai pensé à attribuer à chaque pixel une valeur alpha de 0 ou 1 selon q'il fait partie du fond ou non mais je ne m'en sors pas (comment atteindre chaque pixel individuellement ?)

    Je suis ouvert à toutes les idées
    Merci d'avance

  2. #2
    Membre éclairé Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
    	glEnable(GL_BLEND);

    ce code te permettra de rendre la couleur noire transparente

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Certes le fond n'apparait plus mais les pixels de mon arbre deviennent eux transparents ce que je ne voulais pas.
    L'idée serait d'attribuer alpha=0 aux pixels noirs et alpha = 1 aux autres ...
    Merci en tt cas de ta réponse (rapide)

  4. #4
    Membre éclairé Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Par défaut
    Citation Envoyé par GoldenEye
    L'idée serait d'attribuer alpha=0 aux pixels noirs et alpha = 1 aux autres ...
    Merci en tt cas de ta réponse (rapide)
    que tu le fasse en code ou avec un logiciel de retouche d image , si tu mets un alpha a zero pour tous les pixels noir , meme les pixels noirs de ton arbre auront l alpha a zero !

    donc tu aura le meme resultat qu avec glBlend



    sinon pour modifier l alpha des pixels en code renseigne toi sur le format d image que tu utilise ( TGA BMP ?..) et tu peux effectivement en iterant les pixels attribuer un alpha à 0 si tes trois couches rvb sont == 0

    mais bon t aurais plus vite fait dans photoshop

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
    L'équation correspondant à ce code est Src.c * Src.a + Dest.c * 1. Donc :

    - On verra forcément le fond apparaître
    - Le canal alpha de la source sera utilisé, ce qu'apparemment notre ami n'a pas dans sa texture.

    Le mieux est effectivement de mettre au préalable un canal alpha dans ta texture, puis d'utiliser glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).
    Sinon, euh... zut c'est vrai que je suis nul en OpenGL .

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Les bmp contiennent ils un canal alpha ou bien dois je trouver un loader de png par ex ?
    Et comment activer ledit canal alpha lors du chargement de la texture ? c'est GL_RBGA ?
    Merci encore

  7. #7
    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
    Les bmp ne contiennent pas de canal alpha. Les png en contiennent un, mais également les tga. Je te conseille ces derniers, ils sont plus répandus. Tu pourras trouver un loader de tga par exemple sur le site de NeHe.

    Pour charger des données au format RGBA, c'est bien GL_RGBA

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    voilà, effectivement, j'ai utilisé :
    -un utilitaire de conversion bmp => tga en spécifiant quels pixels doivent être transparents
    - un loader TGA pour openGL

    Et... ça marche. Mes décors se superposent correctement sur le fond
    Par conséquent, je tiens à vous remercier de votre aide
    A très bientôt

  9. #9
    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
    et pour accelerer le rendu un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0);
    ne laissera passer que les fragment qui on un alpha > 0.
    l'aventage de cette operation (a faire en plus du blending, je precise...) est qu'elle intervient avant les operations de blending, et ainsi certains fragment (ceux avec l'alpha <= 0) ne passeront même pas par ces operation de blending => plus rapide.

    par contre pour info, l'alpha test intervient apres la phase de fragment processing, donc si on utilise un fragment programme, on a tout interet a mettre une instruction KILL qui test l'alpha pour sortire du programme en avance...
    * 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

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Merci pour l'astuce, je vais l'implémenter tout de suite

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2006, 12h09
  2. Réponses: 4
    Dernier message: 26/01/2006, 16h13
  3. [c#] probleme fenetre non rectangulaire
    Par orelero dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/12/2005, 12h32
  4. Comment faire un panel non rectangulaire?
    Par grincheux dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/05/2003, 15h47

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