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

DirectX Discussion :

Transparence qui ne marche pas sur toute les machines


Sujet :

DirectX

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Transparence qui ne marche pas sur toute les machines
    J'utilise dans mon programe Directx7 des fonction de rendu par alphablending.
    Ces fonctionalité fonctionne très bien sur mon PC (une vielle bécane avec une carte ATI 3D RAGE PRO), mais pas sur des PC plus récents équipés d'ATI ou de GForces...
    J'ai déja entendu parlé de ce genre de problème, mais je ne sais pas comment le résoudre.

    Merci d'avance.

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca fait quoi exactement quand ça marche pas ? Et avec un bout de code ce serait + facile de t'aider...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Il y a 2 type de transparence qui ne marche pas,
    l'alphablending et la clé de couleur sur une texture. Mais j'ai vu dans l'aide directx que la clé de couleur
    utilisait en fait l'alphablending : le problème doit donc être le même.

    Pour l'alphablending, voici le code :
    //dans la fonction de créatation des sommets de la primitive :
    shadow_verts[i]=D3DLVERTEX(position[i],0x7f000000,0,0.0f,0.0f);

    //dans la fonction de rendu :
    device->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );

    device->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA );

    device->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA );

    device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,D3DFVF_LVERTEX,shadow_verts,9,
    shadow_index,24,0);
    /*Lorsque cela fonctionne, l'ombre n'est pas opaque (on voit ce qu'il y a derrière). Lorsque cela ne fonctionne pas, l'ombre est noire, comme si l'alphablending n'était pas activé.*/


    Pour la clef de couleur :
    //dans la création de la texture :
    lpTexture=NULL;
    // chargement de la texture :
    lpTexture=CreateTexture(device,param.TexName);
    //après avoir creer la texture, il faut indiquer à la surface DirectDraw qui la
    //contient (lpTexture) qu'il y aura une clef de couleur (ici vert saturé) pour ne
    //pas prendre les pixels de cette couleur lorsque l'on affichera la surface.
    //on récupére le format de pixel utilisé pour l'affichage :
    DDPIXELFORMAT ddpf;
    ddpf.dwSize=sizeof(ddpf);
    lpDDS_FrontBuffer->GetPixelFormat(&ddpf);
    //on détermine ensuite la clef adéquate pour le format de pixel :
    DWORD KeyColor=ddpf.dwGBitMask;//ici clef verte (G)
    //on définit la clef de couleur :
    DDCOLORKEY key;
    key.dwColorSpaceLowValue=KeyColor;
    key.dwColorSpaceHighValue=KeyColor;
    //on applique la clef à la surface DirectDraw :
    if(lpTexture){
    lpTexture->SetColorKey(DDCKEY_SRCBLT,&key);
    }

    //dans la fonction de rendu :
    //active l'utilisation de la clef de couleur
    device->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE,TRUE);

    //dessine la primitive
    device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX,
    arbre_verts,8,
    plan_index,24,
    0);

    /*lorsque cela fonctionne, on ne voit pas la bordure rectangulaire de la texture que j'utilise pour le représenter les arbres*/
    [/img]

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Hmm bon, c'est du Dx7, ça va pas être simple tout ça

    Déjà essaye de remplacer D3DBLEND_SRCALPHA (et D3DBLEND_INVSRCALPHA) par D3DBLEND_SRCCOLOR (et D3DBLEND_INVSRCOLOR), et voir si ça fait qq chose. Je suis pu trop sur, mais là tu affectes une valeur alpha a la couleur diffuse de tes vertices, donc il se pourrait que ça ne le prenne pas en compte (normalement l'alpha est pris de la texture). Bon mais normalement la texture est modulée avec la couleur diffuse par défaut (sauf si t'as changé tes TextureStageState), donc ça devrait quand même marcher.

    Pour la couleur de transparence, prend plutot le format de pixel de ta texture, plutot que celui de ton front buffer. Parce que si celui ci est en 16 bits, ta colorkey sera 0x001F, et si ta texture est en 32 bits le vert sera 0x0000FF.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci pour ton aide.
    Mais malheureusement le problème n'est pas encore résolu.

    Le fait de remplacer D3DBLEND_SRCALPHA par D3DBLEND_SRCCOLOR
    ne donne pas l'effet graphique recherché. En effet, je cherche à avoir une
    ombre qui assombrisse ce qui se trouve derrière. L'alpha permet cela,alors
    que la couleur me donne une ombre qui "éclairci" le fond.

    Dans mon cas l'alpha n'est pas défini dans une texture (mon ombre
    est juste un rectangle noir non texturé). J'affecte le coefficient
    alpha des sommets de mon ombre lors de leur initialisation :

    shadow_verts[i]=D3DLVERTEX(position[i],D3DRGBA(0.0f,0.0f,0.0f,0.3f),0,0.0f,0.0f);

    ici alpha = 0.3f (j'utilisait dans mon premier exemple la valeur 0x7f000000
    à la place de D3DRGBA(0.0f,0.0f,0.0f,0.3f))
    J'ai trouvé cette technique dans les exemples de shadow volume du SDK DirectX.

    Pour ce qui est de la clé de couleur, je n'est pas encore testé si le fait
    d'utiliser le format de pixel de la texture change quelque chose (je n'est
    pas de PC de test à porté de main un 1er mai ).
    Mais à mon avis cela ne doit rien changer puisque ma texture est stockée
    dans une surface DirectDraw, comme mon FrontBuffer.La texture et le FrontBuffer
    doivent donc avoir le même format de pixel, définit lors de l'initialisation
    de l'objet DirectDraw.

    De plus, sur mon PC, la clé de couleur fonctionne très bien, alors que lorsque
    je passe l'application sur un autre PC, ça ne marche plus. Or, que ce soit sur
    un pc ou un autre, le format de mon objet DirectDraw reste le même puisque
    je le définit toujours à 16 bits dans mon application. Le format de la texture
    bitmap chargée dans la surface DirectDraw ne varie pas non plus en passant sur un autre PC.

    Je sais que mon problème peut paraitre étrange, notement du fait que mon exe
    fonctionne sur certaines machines, mais ne renoncez pas à m'aider s'il vous plait...
    C'est d'autant plus étrange qu'en général, c'est plutôt mon PC qui a du mal a
    gérer les effets de transparence dans les jeux.

  6. #6
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ouais, y a souvent des problèmes entre différentes configurations. En général (d'apres ce que j'ai constaté), ça vient bien souvent d'une erreur dans le programme qui est "tolérée" par la carte 3D, mais pas par une autre.
    Sinon, pour le D3DBLEND_SRCCOLOR, c'etait juste pour voir si ça marchait ou pas. Bon là vu que ça marche c'est que le probleme vient de l'alpha. T'es sur que t'utilises la couleur diffuse dans le rendu de tes vertices (sinon l'alpha ne sera pas pris en compte). Sinon ben... je vois pas trop
    Et pour la couleur de transparence, je crois qu'on peut avoir des textures d'un format différent de celui du front buffer, donc vérifie quand meme de ce coté. Et essaye aussi une autre couleur (le blanc ou le noir), des fois DirectX se melange les pinceaux dans les couleurs (genre il intervertit le bleu et le rouge, etc...).
    Voila voila, je vois pas trop ce qu'il pourrait y avoir d'autre

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai testé le fait de définir la clé de couleur sur la surface de la texture, et c'est bien de là que venait mon erreur. Comme tu l'a dit, la surface de texture n'a pas nécessairement le même format que le frontbuffer. Lorsque je créé ma texture, je recherche le format le plus adéquat pour la carte graphique. Or sur mon petit PC, je suppose que ce format était le même que celui que j'avais définit pour mon front buffer (16 bits), alors que sur des PC plus puissant, la carte devait bien géré des format plus élevé.

    Merci beucoup pour ton aide, il ne me reste plus qu'à régler mon problème de transparence.

  8. #8
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pas de quoi
    Pour l'alpha-blending par contre, je sais pas trop...
    Est-ce que t'as bien défini tes TextureStageState comme ceci ?
    D3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
    D3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    D3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);

  9. #9
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait je viens de me heurter au même probleme là, et voila ce qu'il faut faire (suis-je bête...) :
    D3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
    D3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
    D3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    En effet en définissant les textureStageState comme tu l'a indiqué, ça marche.
    Alors encore une fois, merci !

    En fait je pensait que les textureStageState n'influençait que le rendu des textures, mais si je comprend bien ça définit la façon dont le polygone va être rempli...

    En tout cas bravo pour ta compréhension de mes problèmes et pour la clarté de tes explications. Peut être à une prochaine fois si g d'autres problèmes

Discussions similaires

  1. [MySQL] Une requête qui ne marche pas sur tous les enregistrements
    Par Marc22 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/04/2010, 13h20
  2. .bat qui ne marche pas sur tout les postes
    Par guismoman33 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 06/08/2008, 11h52
  3. Mon client SWING ne se lance pas sur toutes les machines
    Par nicdo77 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 07/12/2007, 09h46
  4. Réponses: 8
    Dernier message: 01/08/2007, 15h38
  5. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04

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