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

API graphiques Discussion :

Blending de pixel.


Sujet :

API graphiques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Blending de pixel.
    Dans le cadre de mon apprentissage personnel( conception d'un petit moteur 3D software ) j'ai mis en place un Z-Buffer , il fonctionne , néanmoins j'aurais voulu pouvoir faire du blending lorsque je veut écrire un pixel transparent dans mon buffer.
    J'ai recherché comment fonctionne la fonction de blending sous OpenGL
    j'ai trouvé ceci :

    http://www.polytech.unice.fr/~Buffa/cours/synthese_image/SLIDES/makeslide/blending/slide5.htm

    http://helios.univ-reims.fr/Labos/LE...enGL/td07.html

    et l'article de bafman & de Laurent.G sur le site.
    avec tout cela j'en ai déduis ceci :

    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
    Color3f * BlendByMode(Color3f * S, Color3f * D,int source , int destination){
     
     
        Color3f *R,*Scr,*Dest,Result;        
        Scr = new Color3f;
         Dest = new Color3f;
     
     
        float f = min(S->alpha,1-D->alpha);
        float Scr_Red,Scr_Green,Scr_Blue,Scr_Alpha;
        float Dst_Red,Dst_Green,Dst_Blue,Dst_Alpha;
     
     
        switch(source)
        {
            case COL_ZERO                : Scr->red = 0;          Scr->green  = 0;           Scr->blue  = 0;          Scr->alpha  = 0;
            case COL_ONE                 : Scr->red = 1;          Scr->green  = 1;           Scr->blue  = 1;          Scr->alpha  = 1;
            case COL_DST_COLOR             : Scr->red = S->red;     Scr->green  = S->green;    Scr->blue  = S->blue;    Scr->alpha  = S->alpha; 
            case COL_ONE_MINUS_DST_COLOR         : Scr->red = 1-D->red;   Scr->green  = 1-D->green;  Scr->blue  = 1-D->blue;  Scr->alpha  = 1-D->alpha;
            case COL_SRC_ALPHA            : Scr->red = S->alpha;   Scr->green  = S->alpha;    Scr->blue  = S->alpha;   Scr->alpha  = S->alpha;
            case COL_ONE_MINUS_SRC_ALPHA        : Scr->red = 1-S->alpha; Scr->green  = 1-S->alpha;  Scr->blue  = 1-S->alpha; Scr->alpha  = 1-S->alpha;
            case COL_DST_ALPHA             : Scr->red = D->alpha;   Scr->green  = D->alpha;    Scr->blue  = D->alpha;   Scr->alpha  = D->alpha;
            case COL_ONE_MINUS_DST_ALPHA         : Scr->red = 1-S->alpha; Scr->green  = 1-S->alpha;  Scr->blue  = 1-S->alpha; Scr->alpha  = 1-S->alpha;
            case COL_SRC_ALPHA_SATURATE          : Scr->red = f;          Scr->green  = f;           Scr->blue  = f;          Scr->alpha  = 1;
            default : break;
        }
     
        switch(destination)
        {
            case COL_ZERO                : Dest->red = 0;                     Dest->green  = 0;                     Dest->blue  = 0;                     Dest->alpha  = 0;
            case COL_ONE                 : Dest->red = 1;                     Dest->green  = 1;                     Dest->blue  = 1;                     Dest->alpha  = 1;
            case COL_SRC_COLOR             : Dest->red = S->red;                Dest->green  = S->green;              Dest->blue  = S->blue;               Dest->alpha  = S->alpha;
            case COL_ONE_MINUS_SRC_COLOR         : Dest->red = 1-S->red;              Dest->green  = 1-S->green;            Dest->blue  = 1-S->blue;             Dest->alpha  = 1-S->alpha;
            case COL_SRC_ALPHA            : Dest->red = S->alpha;              Dest->green  = S->alpha;              Dest->blue  = S->blue;               Dest->alpha  = S->alpha;
            case COL_ONE_MINUS_SRC_ALPHA        : Dest->red = 1-S->alpha;            Dest->green  = 1-S->alpha;            Dest->blue  = 1-S->blue;             Dest->alpha  = 1-S->alpha;
            case COL_DST_ALPHA             : Dest->red = D->alpha;              Dest->green  = D->alpha;              Dest->blue  = D->blue;               Dest->alpha  = D->alpha;
            case COL_ONE_MINUS_DST_ALPHA         : Dest->red = 1-D->alpha;            Dest->green  = 1-D->alpha;            Dest->blue  = 1-D->blue;             Dest->alpha  = 1-D->alpha;
            default : break;
        }
     
     
     
        Result.red   =  S->red*Scr->red     + D->red*   Dest->red;
        Result.green =  S->green*Scr->green + D->green* Dest->green;
        Result.blue  =  S->blue*Scr->blue   + D->blue*  Dest->blue;
        Result.alpha =  S->alpha*Scr->alpha + D->alpha* Dest->alpha;
     
        R = RGBa(Result.red,Result.green,Result.blue,Result.alpha);
     
        return R;
    }
    je soupçonne cette partie d'être foireuse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Result.red   =  S->red*Scr->red     + D->red*   Dest->red;
        Result.green =  S->green*Scr->green + D->green* Dest->green;
        Result.blue  =  S->blue*Scr->blue   + D->blue*  Dest->blue;
        Result.alpha =  S->alpha*Scr->alpha + D->alpha* Dest->alpha;
    L'intervalle des couleurs est de [0,1] , j'ai des résultats étranges sur l'écran.

    Est ce que j'ai oublié de faire quelque chose ?

    Merci d'avance.

  2. #2
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    C'est une typo ?

    case COL_ONE_MINUS_SRC_ALPHA : Dest->red = 1-S->alpha; Dest->green = 1-S->alpha; Dest->blue = 1-S->blue; Dest->alpha = 1-S->alpha;

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour LeGreg , je ne sais pas ce que tu appelles typo , mais si tu entends par là , "du tout fait à la main" , oui.
    je veut pouvoir Mélanger à la façon OpenGL , deux couleurs RGBA.
    j'utilise cette classe pour le moment , mais elle n'offre pas tout les modes de mélanges.


    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
    class CColor3f
    {
    public:
        float red,green,blue,alpha;
     
        // Constructeur
        CColor3f(){};
        // Constructeur    surchargé.
        CColor3f(float red,float green,float blue,float alpha);
        ~CColor3f(){};
     
        // Mélange 2 couleurs en fonction du %
        void Blend( CColor3f * color, float percent);
    };
     
    void CColor3f::Blend( CColor3f * color, float percent)
    {
        this->red    = sqrt( this->red *  this->red * percent + color->red   * color->red   * (1-percent));
        this->green    = sqrt( this->green *  this->green * percent + color->green * color->green * (1-percent));
        this->blue    = sqrt( this->blue *  this->blue * percent + color->blue  * color->blue  * (1-percent));
        this->alpha    = sqrt( this->alpha *  this->alpha * percent + color->alpha * color->alpha * (1-percent));
    }
    Merci.

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    "typo" = faute de frappe. Tu n'as jamais entendu parler de cette expression ?

    Dans le code que j'ai surligné :
    alpha -> blue

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    "typo" = faute de frappe. Tu n'as jamais entendu parler de cette expression ?
    Ha , non non, le code compile
    Je dormirais moins bête ce soir.

    Edit : j'ai compris

    je vais testé de ce pas...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    A prioris cela à l'air de fonctionner , merci LeGreg , j'avais l'erreur sous les yeux.
    je ferais des tests + en profondeur , et si j'ai des soucis , je posterais ici.


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

Discussions similaires

  1. [TImage] Transfert de Picture par pixels.
    Par H2D dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2003, 14h37
  2. [VB6] [Graphisme] Transfert d'image pixel par pixel
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/10/2002, 09h53
  3. Réponses: 2
    Dernier message: 30/05/2002, 10h19
  4. Alpha blending
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 23/05/2002, 19h37
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

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