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 d'un objet 3D avec des matériaux


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut Transparence d'un objet 3D avec des matériaux
    Bonjour,

    J'ai besoin de rendre transparent un objet 3D, et j'ai beau chercher, pour l'instant je ne trouve pas de solution.

    J'ai essayé l'alphablending mais il doit me manquer quelque chose pour que ça marche.

    L'objet est dessiné à partir d'un VertexBuffer et d'un IndexBuffer.
    Le VertexBuffer contient des CustomVertex.PositionNormal.

    Lors du rendu:
    - j'active l'alphablending:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    m_device.RenderState.AlphaBlendEnable = true;
                    m_device.RenderState.AlphaTestEnable = true;
     
                    m_device.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
                    m_device.RenderState.AlphaDestinationBlend = Blend.InvSourceAlpha;
    - Je change la composante alpha de la couleur diffuse du matériel et la met à 50

    Seulement, quoi que je fasse, l'objet reste opaque...
    Pourtant la composante alpha est bien de 50.

    Savez-vous ce qui peut clocher, ou connaissez-vous un site ou un endroit où il y a des explications claires au sujet de l'alphablending?
    J'ai bien cherché mais pour l'instant je n'ai rien trouvé de tel.

    merci d'avance pour vos réponses.

  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 : 39
    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
    Est-ce que ton material est bien pris en compte (ie si tu changes les composantes RVB de la couleur diffuse est-ce que ça se voit) ?

    Est-ce que tu rends bien ton objet transparent après tous les objets opaques ? Et dans l'ordre du plus lointain au plus proche si tu as plusieurs objets transparents ?

    Note qu'ici l'alpha-test est inutile, tu peux le désactiver (ce sera même plus sûr, vu que tu n'initialises pas les autres states associés et ne sait donc pas quel effet il va avoir).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    merci pour la réponse,

    le matériel est bien pris en compte, j'ai fait l'essai avec le changement de la couleur.

    L'ordre du rendu par contre n'est pas forcément respecté... mais en mettant le cullmode à "None", je devrais au moins voir la transparence sur mon objet non?

  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 : 39
    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 forcément, tout dépend de l'ordre dans lequel les faces sont définies. En gros d'un côté ce sera bon et de l'autre non.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Ben dans ce cas ce n'est bon ni d'un côté ni de l'autre. J'ai fait une rotation autour de l'objet et ça reste opaque, quoi que je fasse.

    Est-ce que tu pourrais me dire quelles sont les étapes nécessaires pour activer l'alphablending dans la configuration énoncée dans mon premier message? Peut-être que j'ai oublié de faire quelque chose.... Enfin là, je voie vraiment plus....

  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 : 39
    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
    Et si tu mets l'alpha directement dans la couleur diffuse de tes sommets ça donne quoi ?

    Sinon jette un oeil à ça, ça peut toujours servir :
    http://jeux.developpez.com/faq/direc...LEMES_probleme

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Et bien en fait, j'aimerais éviter de donner une couleur par sommet, et cela pour une raison très simple: je veux pouvoir changer la couleur de mes objets au cours de l'exécution du programme, et je pense que ça ira bien plus vite en changeant la couleur du matériel plutôt qu'en parcourant tous les points de mon objet dans une boucle pour changer leur couleur. Je ne sais pas exactement ce qui est le plus rapide, mais je penche pour la solution des matériaux.

    J'ai jeté un coup d'oeuil à ton lien, je vais essayer de me pencher sur le retour des fonctions un peu plus

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Bon, j'ai vérifié que les renderstate s'activent bien, et tout semble normal. A part ça, les fonctions que j'utilise n'ont pas de valeur de retour (DrawIndexedPrimitive, SetStreamSource pour tracer l'objet).

    Si il n'y a pas d'autre solution j'utiliserais les couleurs par vertex, mais j'aimerais éviter...

  9. #9
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    Peut-tu nous montrer ton bon de code qui donne la couleur diffuse à ton material?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    oui, le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dxmat.Diffuse = Color.FromArgb(mlst_Materiel.GetMateriel(pObj.IdMateriel).Opacite, mlst_Materiel.GetMateriel(pObj.IdMateriel).Diffuse);
    dxmat est du type Material (directx)

    Le premier paramètre contient l'opacité (entre 0 et 255), le deuxième récupère la couleur initiale de l'objet.

    En vérifiant pendant le debug, je vois que mon matériel est bien initialisé avec les paramètres voulus.

    Est-ce qu'il y a un ordre précis à respecter lors de l'initialisation des RenderStates pour obtenir la transparence?

  11. #11
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    oki alors moi pour le blend je n'utilise pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_device.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
    m_device.RenderState.AlphaDestinationBlend = Blend.InvSourceAlpha;
    mais plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_device.RenderState.SourceBlend =  Blend.SourceAlpha;
    m_device.RenderState.DestinationBlend =  Blend.InvSourceAlpha;
    je ne sais pas si ça change quelque chose mais bon, à tester.

    Enssuite essaye d'allumer la lumière si n'est pas déjà fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_device.RenderState.Lighting = True;

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    YOUHOU!!!!!!

    Bon, ben c'était bien ça, il fallait utiliser DestinationBlend et SourceBlend tout court... C'est dingue, j'ai pas vu ce détail en tout ce temps!

    Un grand merci à toi, pour m'voir montré l'erreur qui était sous mon nez depuis le début

    Puis merci à tous ceux qui ont prit la peine de s'attarder sur le problème

    bonne journée et à bientôt!

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Bon, je me suis un peu précipité dans cette histoire, parce que la transparence marche, mais par contre il y a un autre problème qui se manifeste: (c'est plus simple en image)



    J'ai essayé de désactiver le zbuffer, j'ai mis le CullMode à None, et différentes autres combinaisons mais ces pseudo-polygones indésirables continuent à apparaître.

    J'ai entendu dire que lors de l'affichage d'un objet transparent, il fallait au préalable trier les polygones (du plus éloigné au plus proche), et j'ai l'impression que le problème vient de là. Mais cela ne devrait pas être géré par DirectX ou par la carte graphique directement?

  14. #14
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    ton problème est dû en partie au fait qu'en affichant un polygone tranparent j'imagine que tu met à jour le zbuffer parceque tu n'as pas désactivé l'écriture dans le zbuffer

    si tes faces étaient triées par ordre de profondeur et que tu affichais les faces du fond jusqu'aux faces de devant, le problème ne se poserait pas
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Et bien effectivement, je n'avais pas désactivé l'écriture dans le zbuffer.... par contre, si l'affichage change un peu, le problème reste présent.

    Tu parles de trier les polygones, mais comment? Sachant qu'à chaque fois que la caméra se déplace il faudrait refaire l'opération, ça risque d'être couteux en temps de calul.......

    Est-ce qu'il y a une autre solution? Ou une fonction de DirectX qui pourrait s'en charger?

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Est-il possible que la carte graphique (ou directx) s'occupe du tri des polygones dans le cas où on attribue une couleur à chacun des vertex?

  17. #17
    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
    Citation Envoyé par pavicf
    Est-il possible que la carte graphique (ou directx) s'occupe du tri des polygones dans le cas où on attribue une couleur à chacun des vertex?
    La question serait alors : pourqoi est-ce que tu crois que c'est plus facile pour la carte graphique que pour toi ? A priori c'est encore moins facile pour elle, puisqu'elle devrait mémoriser toute la scène etc.. Une carte graphique est juste une machine à état simple, elle traite le triangle courant et oublie tout de l'état ou du triangle précédent et ne sait rien du suivant.

    Comment font les autres gens ? ils ignorent le problème, evitent d'utiliser trop d'objets alpha transparents, essaient de faire un tri global par objets ou cachent les artefacts en utilisant des couleurs proches sans update de la profondeur (fumée) ou une formule de blending additif (feu, etincelles).

    Si tu es vraiment un ayatollah de la transparence tu as le depth peeling
    http://developer.nvidia.com/object/I...nsparency.html
    qui a l'avantage de bien marcher mais avec quelques caveats : nombre de passes nécessaire qui fait baisser la perf, et ne fonctionne pas avec le multisampling (antialiasing hardware).

    Il y a d'autres solutions mais qui ne marchent pas avec les cartes graphiques actuelles.

    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

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    La question serait alors : pourqoi est-ce que tu crois que c'est plus facile pour la carte graphique que pour toi ?
    Et bien je n'ai jamais pensé que ce serait plus facile ou plus dur, juste plus efficace. Si les cartes 3D sont apparus c'est bien dans le but d'effectuer des opérations complexes qui prennent énormément de temps au CPU. La gestion de la transparence fait partie de cette définition.

    Et puis il y a le ZBuffer qui se charge d'une opération similaire à celle nécessaire pour traîter correctement la transparence.... Donc bon, pourquoi pas une sorte "d'alphabuffer"....

    Puis je me disais que peut-être DirectX contient des routines pour effectuer cette tache. Mais bon, après avoir longuement cherché sur le web, je n'ai rien trouvé d'autre que le tri des polygones.

    Merci pour ton lien, la technique qui y est exposée est assez ingénieuse et intéressante.

    Quelles sont les autres techniques dont tu parles?

    merci pour la réponse et bonne journée!

  19. #19
    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
    Citation Envoyé par pavicf
    Quelles sont les autres techniques dont tu parles?
    Accumulation buffer (principalement software mais présents sur certaines vieilles architectures obsolètes ou théoriques).
    De meme les architectures "chunkers" comme les technologies PowerVR et Gigapixel pouvaient traiter de par leur nature les polygones transparents. Mais ils ont une approche non "traditionnelle" du pipeline ce qui fait qu'ils ont leurs propres problèmes (et ont disparu du marché PC).

    Il y en a d'autres que je ne vais pas exposer ici..

    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

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Merci, je vais regarder sur le net ce que ça donne plus en détail.

    Mon pb n'est peut-être pas totalement résolu, mais j'ai suffisament d'infos pour pouvoir le résoudre tout seul grâce à vos contributions. Merci à tous ceux qui ont répondu à mes questions et m'ont aidé, j'essaierais de publier mes avancements dans ce topic (si j'avance ), ça pourra peut-être servir à certains...

    allez, on va dire résolu.

    bonne journée à tous!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 28
    Dernier message: 29/12/2011, 19h24
  2. [C#]Travailler en synchrone avec des objets asynchrone
    Par mister3957 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2006, 18h12
  3. Réponses: 6
    Dernier message: 05/07/2006, 23h47
  4. [VB.NET] Form avec des Nuances de Transparence !!
    Par jazz matazz dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/02/2006, 12h00
  5. Réponses: 27
    Dernier message: 03/02/2003, 12h27

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