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 texture


Sujet :

DirectX

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 26
    Par défaut transparence texture
    alors voilà, j'ai une texture appellée "COLLIDE.DDS" qui fait 64x64 j'ai des polygones que je dois afficher avec différentes textures, mais la différence c'est qu'il faut que tous les polygones avec cette texture spécialement soient invisibles, comment faire ?
    ( en fait ces polygones représentent des murs invisibles )

    j'ai déjà cherché à propos de la transparence etc ... si j'ai bien compris il faut que je change le canal alpha dynamiquement de cette texture ? si oui comment faire ?
    je débute alors je n'ai pas compris grand chose =(

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Question bête : si ces murs "invisibles" sont... invisibles, pourquoi les afficher ?

    Sinon si ta texture contient bien un canal alpha il suffit de paramètrer correctement l'alpha-blending pour que ça marche. Mais bon s'ils doivent être totalement invisibles pas besoin d'alpha, enfin je suis sûr que j'ai loupé un truc

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 26
    Par défaut
    j'ai déjà activé l'alpha blending et d'autres textures qui elles ont déjà un canal alpha s'affichent très bien
    là cette texture c'est une texture bleue elle a rien de transparente
    les murs doivent être invisibles car je suppose qu'ils servent pour les collisions
    je dois donc rendre la texture transparente une fois chargée?

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ben si tes murs servent juste pour les collisions, ne les affiche pas, ne les utilise qu'au moment de tester les collisions.

    Sinon, si tu veux créer un canal alpha pour ta texture tu peux le faire : tu verrouilles, tu mets à 0 le canal alpha de tes pixels, tu deverrouilles.

    Mais tu peux aussi utiliser un facteur de blend (nul) au lieu de prendre le canal alpha de ta texture (qui n'en a donc pas), mais le mieux reste de ne pas afficher tes murs...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 26
    Par défaut
    et ca ressemble à quoi en lignes de codes ? =)

    si je ne les affiche pas j'ai des effets secondaires, d'autres polygones ne s'affichent pas ... c'est pour ca que je voudrais essayer plutot de les rendre transparent, surtout qu'il y a d'autres textures que je devrais rendre semi transparents donc je suppose que ce sera le meme principe ?

    le probleme c'est que je trouve aucune documentation =(

    par exemple l'alpha blending, les render states etc... j'ai absolument rien compris comment ca marche, je n'ai fait que du copier coller, et ca m'embette vraiment =(

    pour changer les textures dynamiquement
    très bien j'ai compris il faut faire un lockrect puis un unlockrect mais entre les deux il faut faire quoi ? comment c'est structuré la dedans ???
    voilà de nombreux manques d'information qui font que je suis completement perdu =(

    puis l'alpha channel j'avoue être perdu, je ne savais pas qu'une texture pouvait en avoir et ne pas en avoir ... je pensais que ne pas en avoir signifait simplement que le A dans RVBA etait à 255 ...
    etc ... etc ...
    beaucoup de flou donc =(

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ouhlalalala ça fait beaucoup de questions tout ça
    Pour la plupart tu pourras trouver ton bonheur en feuilletant la documentation du SDK.

    si je ne les affiche pas j'ai des effets secondaires, d'autres polygones ne s'affichent pas
    Pas normal. Normalement si tu veux cacher tous les vertices ayant cette texture, il suffit d'enlever le Draw(Indexed)Primitive qui se trouve entre le SetTexture() qui va charger ta texture transparente et le SetTexture() qui va en charger une nouvelle.

    pour changer les textures dynamiquement
    très bien j'ai compris il faut faire un lockrect puis un unlockrect mais entre les deux il faut faire quoi ? comment c'est structuré la dedans ???
    C'est plutôt bien expliqué dans la doc du SDK. En gros, tu récupères dans ton D3DLOCKED_RECT une valeur de pitch et un pointeur sur les pixels de ta texture.

    Ca donne donc quelque chose comme ça (pour un format A8R8G8B8) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    D3DLOCKED_RECT Rect;
    Texture->LockRect(0, &Rect, NULL, 0);
     
    Rect.Pitch /= 4; // Le pitch est en octets, on le multiplie donc par 8 puis on divise par 32
    unsigned long* Pixels = reinterpret_cast<unsigned long*>(Rect.pBits); // Couleur 32 bits : on prend un unsigned long
    for (unsigned int i = 0; i < Width; ++i)
    {
        for (unsigned int j = 0; j < Height; ++j)
        {
            Pixels[i + j * Rect.Pitch] &= 0x00FFFFFF; // On met à zero le canal alpha en gardant les autres tels quels
        }
    }
     
    Texture->UnlockRect(0);
    puis l'alpha channel j'avoue être perdu, je ne savais pas qu'une texture pouvait en avoir et ne pas en avoir
    Ca dépend du format de pixel avec lequel tu as créé ta texture : D3DFMT_R8G8B8 ne possède pas de canal alpha (pas de A), alors que D3DFMT_A8R8G8B8 possède 8 bits pour l'alpha, par exemple.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 26
    Par défaut
    pour les effets secondaires, c'est sur il faut que je trouve d'où vient le bug ca serait mieux de pas les afficher c'est vrai)

    m'enfin je vais essayer le truc du canal alpha =)
    il faudra que je rende des textures semi transparentes de toute facon
    merci )

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Et attention, si tu les affiches mal on ne verra pas ce qu'il y a derriere, meme s'ils sont invisibles.
    Le mieux (tout de même bizarre ces polygones qui disparaissent) serait encore de faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Device->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0);
    Device->SetRenderState(D3DRS_ZWRITEENABLE, false);
     
    // Rendu de tes polys invisibles
     
    Device->SetRenderState(D3DRS_COLORWRITEENABLE, 0xF);
    Device->SetRenderState(D3DRS_ZWRITEENABLE, true);
    Ainsi tu n'écriras ni dans le color buffer ni dans le Z-Buffer. Ce qui a peu d'interet puisque finalement tu ne vas écrire nulle part, mais bon si ça ne marche vraiment pas, ma foi...

    Mais je te conseille quand même d'essayer de résoudre ce problème plutot que de "bidouiller" une solution

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 26
    Par défaut
    oui )
    et l'histoire du blend factor, de quoi tu voulais parler ?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Device->SetRenderState(D3DRS_BLENDFACTOR, 0x0); 
    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR); 
    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVBLENDFACTOR); 
    Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
    Voire encore...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); 
    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); 
    Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Par défaut
    si tu veux v'la un lien vers un cours en français sur directX (avec des exemple simple) et ca parle de pas mal de truc dont les renderstate.
    http://<br /> http://www.univ-reims...o/Image/<br />

    Sylvain

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

Discussions similaires

  1. Problème transparence Texture
    Par bchandroid dans le forum OpenGL
    Réponses: 6
    Dernier message: 13/07/2010, 22h46
  2. Problème transparence texture (OpenGL + Qt)
    Par killerjeff dans le forum OpenGL
    Réponses: 2
    Dernier message: 25/02/2010, 15h24
  3. Réponses: 3
    Dernier message: 29/07/2009, 14h32
  4. pb de transparence/texture/sprite
    Par Fikus dans le forum DirectX
    Réponses: 6
    Dernier message: 15/05/2004, 22h38
  5. Texture Transparence
    Par Cartman dans le forum DirectX
    Réponses: 1
    Dernier message: 02/03/2004, 22h02

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