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

SDL Discussion :

Problème de transparence


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Problème de transparence
    Bonjour,

    Alors, voilà, j'essaie d'utiliser la bibliothèque SDL_fgx afin d'avoir accès à des primitives sympathiques pour SDL ainsi que pour les filtres et zoom.
    Malheureusement, lorsque j'essaie d'afficher dans une surface un cercle (ou autre forme) avec un blending non opaque, le cercle ne s'affiche pas (il s'affiche si le blending est opaque).

    Par contre, j'ai remarqué que si je dessine cette forme sur mon screen( la surface renvoyée par SetVideoMode), le cercle apparaît.

    Le fait est que j'ai mon screen, puis le dessine ce cercle dans une autre surface que je blit sur le screen dessus après.

    Comment cela se fait-il ? Sachant de plus qu'avec FillRect de SDL, ça marche parfaitement ?

    Merci d'avance..

    --
    ghalaax

  2. #2
    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 : 43
    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
    Sans un code qui montre les différents problèmes, il est quasiment impossible de répondre à la question.

    - Soit sûr que les différentes surfaces soient du même format.

    Jc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Désolé, en effet, je vais vous donner le bout de code qui ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SDL_Rect dst;
       surface_ = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,
    				   size_.width,
    				   size_.height, 32,
                                       rmask, gmask, bmask, amask);
       boxRGBA(surface_, 200, 100, 100,
    	       200, 255, 0, 0, 100);
          dst.x = 0;
          dst.y = 0;
          //screen est la surface donnée par SetVideoMode
           while (SDL_BlitSurface(surface_ 0, screen, &dst) == -2)
                 ;
    Par contre la trasnparence marche avec ce code là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SDL_Rect dst;
       surface_ = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,
    				   size_.width,
    				   size_.height, 32,
                                       rmask, gmask, bmask, amask);
          SDL_FillRect(surface_, 0, GetColor(surface_, 255, 0, 0, 75));
         //GetColor me rtourne juste l'Uint32 de la couleur correspondant
         // au valeurs r g b a données en argument.
          dst.x = 0;
          dst.y = 0;
          //screen est la surface donnée par SetVideoMode
           while (SDL_BlitSurface(surface_ 0, screen, &dst) == -2)
                 ;
    Merci d'avance.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bon, j'ai testé une autre méthode

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SDL_Rect dst;
       surface_ = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,
    				   size_.width,
    				   size_.height, 32,
                                       rmask, gmask, bmask, amask);
       boxRGBA(surface_, 200, 100, 100,
    	       200, 255, 0, 0, 100);
          dst.x = 0;
          dst.y = 0;
          //screen est la surface donnée par SetVideoMode
           while (SDL_BlitSurface(surface_ 0, screen, &dst) == -2)
                 ;
    je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SDL_Rect dst;
       surface_ = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,
    				   size_.width,
    				   size_.height, 32,
                                       rmask, gmask, bmask, amask);
       boxRGBA(surface_, 200, 100, 100,
    	       200, GetColor(surface_,255, 0, 0, 100));
          dst.x = 0;
          dst.y = 0;
          //screen est la surface donnée par SetVideoMode
           while (SDL_BlitSurface(surface_ 0, screen, &dst) == -2)
                 ;
    là, la boite s'affiche, mais ne vois pas ce qui a été précédemment affiché sur screen et qui est sous surface_. (avec FillRect, tout est très bien)

    Merci d'avance

  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 : 43
    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
    [QUOTE=ghalaax]
    je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SDL_Rect dst;
       surface_ = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,
    				   size_.width,
    				   size_.height, 32,
                                       rmask, gmask, bmask, amask);
       boxRGBA(surface_, 200, 100, 100,
    	       200, GetColor(surface_,255, 0, 0, 100));
          dst.x = 0;
          dst.y = 0;
          //screen est la surface donnée par SetVideoMode
           while (SDL_BlitSurface(surface_ 0, screen, &dst) == -2)
                 ;
    Quelle idée de faire un while autour de SDL_BlitSurface... C'est une superbe solution pour avoir une boucle infinie dans un programme qui plante ! Cette solution avait été mis en place pour après faire un lock sur la surface et remettre la surface en place...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) {
                    while ( SDL_LockSurface(image)) < 0 )
                            Sleep(10);
                    -- Write image pixels to image->pixels --
                    SDL_UnlockSurface(image);
            }
    là, la boite s'affiche, mais ne vois pas ce qui a été précédemment affiché sur screen et qui est sous surface_. (avec FillRect, tout est très bien)
    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       boxRGBA(surface_, 200, 100, 100,
    	       200, GetColor(surface_,255, 0, 0, 100));
    Je ne vois pas comment cela peut compiler, tu n'as pas le bon nombre d'arguments...

    Serait-ce possible d'avoir des versions minimales/compilables des codes que tu testes ?

    Jc

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Je ne vois pas comment cela peut compiler, tu n'as pas le bon nombre d'arguments...
    En effet, je me suis trompé lorsque j'ai écris le post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       boxColor(surface_, 200, 100, 100,
    	       200, GetColor(surface_,255, 0, 0, 100))
    désolé

    Merci pour tes réponses en tout cas

    PS : je peux t'envoyer le code que j'utilise pour l'instant dans un zip si ça peut t'aider à comprendre

  7. #7
    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 : 43
    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
    Citation Envoyé par ghalaax
    PS : je peux t'envoyer le code que j'utilise pour l'instant dans un zip si ça peut t'aider à comprendre
    Vu la taille du code, tu devrais arriver à le mettre dans le fil ici ou à le joindre en fichier joint.

    Jc

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Je t'envoie le zip du code utilisé.

    Merci !

    --
    ghalaax
    Fichiers attachés Fichiers attachés

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Hello

    Bon, finalement, j'ai trouvé

    J'utilisais (normal) des masques pour les couleurs quand je créais une RGBSurface.
    Le fait est que SDL_gfx utilisait exactement l'inverse (ou mon screen, va savoir). Les couleurs étaient donc mappées différemment sur mes deux surfaces, donc le blit se faisait mal.
    Voilà

    Merci encore pour tes réponses !
    Bonne journée

  10. #10
    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 : 43
    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
    Citation Envoyé par ghalaax
    Hello

    Bon, finalement, j'ai trouvé

    J'utilisais (normal) des masques pour les couleurs quand je créais une RGBSurface.
    Le fait est que SDL_gfx utilisait exactement l'inverse (ou mon screen, va savoir). Les couleurs étaient donc mappées différemment sur mes deux surfaces, donc le blit se faisait mal.
    Voilà

    Merci encore pour tes réponses !
    Bonne journée
    Effectivement, cela peut poser des problèmes

    D'où ma question de départ :

    - Soit sûr que les différentes surfaces soient du même format.


    Jc

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

Discussions similaires

  1. [ImageList] problème de transparence
    Par Rayek dans le forum Delphi
    Réponses: 7
    Dernier message: 19/05/2006, 11h12
  2. Réponses: 13
    Dernier message: 01/12/2005, 05h34
  3. Réponses: 5
    Dernier message: 18/03/2005, 20h10
  4. [DX9] [Debutant] Problème de transparence :(
    Par SekYo dans le forum DirectX
    Réponses: 5
    Dernier message: 10/09/2004, 14h19
  5. Réponses: 8
    Dernier message: 06/07/2004, 18h30

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