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 :

Colorier une texture en employant le stencil


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 28
    Par défaut Colorier une texture en employant le stencil
    Bonjour,

    Je réalise un jeu 2D dans lequel j'aimerais que le joueur soit en mesure de personnaliser la couleur de son véhicule.

    Le véhicule est dessiné grâce à une texture 2D ayant une forme rectangulaire à l'origine mais dont les sections inutiles sont effacées grâce au blending alpha.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
    J'ai pensé à appliquer une couleur personnalisable sur la texture en utilisant un rectangle coloré de même dimension que la texture. J'ai d'abord pensé que là encore, le blending serait suffisant pour me débarasser des bords inutiles du rectangle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBlendFunc(GL_DST_ALPHA, GL_SRC_COLOR);
    Cela n'a pas fonctionné et la couleur apparaît sur l'ensemble du rectangle, pas seulement les sections dessinées.

    En potassant, j'ai décidé d'employer le stencil dont le but semble bien de restreindre la zone de dessin. Ça me donne le code suivant :

    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
    void Sprite::affiche()
    {
    	traceStencil();
    	testStencil();
    }
     
    void Sprite::traceStencil()
    {
    	glClear(GL_STENCIL_BUFFER_BIT);
    	glDisable(GL_DEPTH_TEST);
    	glEnable(GL_STENCIL_TEST);
    	glStencilFunc(GL_ALWAYS, 1, 1);
    	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    	glEnable(GL_ALPHA_TEST);
    	glAlphaFunc(GL_GREATER, 0.1f) ;
    		traceTexture();
    	glDisable(GL_ALPHA_TEST);
    }
     
    void Sprite::traceTexture()
    {
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D, texture->textu);
    	glColor4f(1.0f,1.0f,1.0f,alpha);
    	glBegin(GL_QUADS);
    		creeSommetHautGauche();
    		creeSommetHautDroite();
    		creeSommetBasDroite();
    		creeSommetBasGauche();	
    	glEnd();
    	glDisable(GL_TEXTURE_2D);
    }
     
    void Sprite::testStencil()
    {
    	glStencilFunc(GL_EQUAL, 1, 1);
    	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    		traceMasque();
    	glDisable(GL_STENCIL_TEST);
    	glEnable(GL_DEPTH_TEST);
    }
     
    void Sprite::traceMasque()
    {
    	glBlendFunc(GL_ZERO, GL_SRC_COLOR);
    	glEnable(GL_BLEND);
    	glColor4f(couleurmasque.rouge, couleurmasque.vert, couleurmasque.bleu, alpha);
    	glBegin(GL_QUADS);
    		creeSommet(HautGauche);
    		creeSommet(HautDroite);
    		creeSommet(BasDroite);
    		creeSommet(BasGauche);		
    	glEnd();
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    	glEnable(GL_BLEND);
    }
    Je n'entre pas plus dans le détail des fonctions de dessin, hors-sujet ici, mais comme vous pouvez le constater, j'ai quand même ajouté un test Alpha afin d'essayer de me débarrasser des zones vides, mais rien n'y fait le rectangle est toujours entièrement colorié.

    Quelqu'un aurait-il une solution soit pour corriger ce code, soit pour obtenir différemment le même résultat ?

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 28
    Par défaut
    Bon fausse alerte,

    J'ai trouvé la solution et elle n'implique ni stencil, ni quoique ce soit d'autre : elle est tellement simple que j'ai honte de moi. Il m'a suffit d'indiquer la couleur que je souhaite appliquer sur la texture au moment de l'affichage, comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Sprite::traceTexture()
    {
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D, texture->textu);
    	glColor4f(couleurmasque.rouge, couleurmasque.vert, couleurmasque.bleu, alpha);
    	glBegin(GL_QUADS);
    		creeSommetHautGauche();
    		creeSommetHautDroite();
    		creeSommetBasDroite();
    		creeSommetBasGauche();	
    	glEnd();
    	glDisable(GL_TEXTURE_2D);
    }
    Ca marche sans aucun problème...

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

Discussions similaires

  1. Color key d'une texture
    Par Freakazoid dans le forum DirectX
    Réponses: 9
    Dernier message: 07/07/2004, 16h48
  2. comment modifier une texture?
    Par tibyann dans le forum DirectX
    Réponses: 6
    Dernier message: 16/06/2004, 15h27
  3. Charger 16x16 sur une texture 256x256
    Par Johngame dans le forum DirectX
    Réponses: 4
    Dernier message: 06/03/2004, 17h16
  4. Chargement d'une texture a partir de la mémoire
    Par logramme dans le forum DirectX
    Réponses: 6
    Dernier message: 27/01/2003, 14h57
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

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