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 :

Rendre une texture alpha de couleur unie


Sujet :

OpenGL

  1. #1
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut Rendre une texture alpha de couleur unie
    Salut,
    J'applique des textures alpha sur des quads. Le titre est peu explicite mais je me demandais s'il y avait moyen de dessiner une texture alpha d'une couleur complètement unie.
    Le but étant de rendre un sprite blanc lorsqu'il est touché (en 2d).
    La texture d'origine n'étant pas uniforme, est-il possible de tracer la texture d'une couleur uniforme mais uniquement la forme, pas le quad entier (sans shader si possible).
    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut,

    si j'ai bien compris, tu veux appliquer par exemple une texture de forme carrée ou rectangulaire avec un disque blanc au milieu et rien autour (disons du noir dans ta texture) sur un quad, et tu voudrais n'afficher que le disque blanc.

    Si ta texture est bien générée, avec alpha = 1 pour le disque et alpha = 0 pour le reste, tu la charges comme n'importe quelle autre texture, en précisant le format GL_RGBA, pour que l'alpha soit pris en compte.

    Ensuite, avant de dessiner ton quad, tu actives le blending, en précisant la fonction de blending que tu souhaites. Le blending mélange la couleur de ton quad avec la couleur de ce qui se trouve derriere. Tu indiques donc à opengl de mélanger la couleur "source (SRC)" (celle de l'objet qu'il est en train d'afficher) et la couleur "destination (DST)" (celle qui se trouve déjà en arrière plan). Tu précises un facteur qui indiques combien de pourcentage de source et de destination doivent être mélangés.C'est là qu'intervient la valeur alpha. Dans ton cas simple, l'alpha indique le taux de transparence (1 = opaque, 0 = complètement transparent / invisible).
    Pour réumer, passe ces deux lignes avant de dessiner ton objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    et celle là après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glDisable(GL_BLEND);
    Note 1 : je ne suis pas sûr à 100% du code, je le tape comme ca de tête donc au cas où ne t'etonnes pas si ca ne compile pas direct
    Note 2: glBlendFunc prends comme parametres le facteur de "mélangeage" pour la couleur source et celui pour la couleur destination. Ici on utilise GL_SRC_ALPHA pour mélanger la source et GL_ONE_MINUS SRC_ALPHA pour la destination, soit pour simplifier:
    couleur finale = (alpha de ton quad, donc de ta texture) * (couleur du quad) + (1 - alpha de ton quad) * (couleur de ce qui se trouve en arrière plan)
    Note 3 : d'un point de vue performances, activer / désactiver un état opengl à chaque frame est assez pénalisant. Pour y remedier, tu peux dans ton cas définir la glBlendFunc et activer le blending une fois dans ton init, puis laisser activé. Il te suffira alors de veiller à ce que l'alpha soit à 1 pour tous les objets non transparents
    Note 4: si tu as des doutes sur la maniere de passer le format de texture, essaie un premier test de blending avec un quad "vert" transparent à 50%, en précisant comme couleur glColor4f(0,1,0,0.5). Si tu peux "voir" à travers c'est bon, le blending marche, il ne te reste plus qu'à passer ta texture comme il faut
    Note 5: euh....c'est un peu long tout ca....désolé si tu t'y connais en opengl ca fait beaucoup de détails...

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Hello,
    je te remercie pour ta réponse détaillée mais en fait je me suis mal exprimé
    Mettons que j'aie une texture avec un cercle comme tu dis mais qu'il ne soit pas blanc et que ce soit une roue (avec le pneu la jante, etc)
    A un moment T je voudrais uniformiser toutes les couleurs de cette texture pour afficher juste sa forme pleine d'une couleur unie. Souvent dans les shoot'em up les ennemis deviennent blanc ou jaune lorsque qu'on les touche, c'est cet effet-là que je recherche. J'ai vu des planches de sprites où toutes les anims avaient été refaites en double en jaune par exemple. Mais c'est grave lourd, ça double toutes les textures et en plus ça complique la gestion des séquence de frames.
    Quelqu'un aurait-il la solution pour faire ça dynamiquement ?
    En fait, y a-t-il moyen de modifier les canaux de couleur d'une texture directement dans OpenGL ? (sans parcourir toutes les pixels et les convertir, quoique si y a que ce moyen faudra que je tente mais ca risque de prendre un max de ressources)

    PS : Pas sûr, mais le Blending en Opengl consomme à fond, il me semble qu'on l'utilise uniquement lorsque que l'on veut "mélanger" des pixels comme tu l'as expliqué mais lorsque tu veux juste "ne pas afficher" certains pixels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0);
    suffit et consomme beaucoup moins.
    A confirmer ^^

Discussions similaires

  1. couleur unie au lieu d'une texture
    Par jafar456 dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/03/2009, 23h52
  2. DX9: Alpha blending dans une texture intermédiaire
    Par Bart1971 dans le forum DirectX
    Réponses: 2
    Dernier message: 30/10/2006, 15h21
  3. Couleur transparente sur une texture TGA
    Par alex6891 dans le forum OpenGL
    Réponses: 13
    Dernier message: 29/07/2006, 22h16
  4. [JAVA3D] Comment active-t-on l'alpha sur une texture?
    Par SuperCed dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/06/2005, 11h50

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