DIrectX Objet transparent !

Résolu
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011 - 22 nov. 2008 à 17:17
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011 - 25 nov. 2008 à 16:21
Bonjour,

Je me suis récemment initié à DirectX 9 avec l'idée de réaliser un moteur 3D Isométrique (vue 3e personne).
J'arrive ainsi à générer une "carte" constituée de pavés.
J'applique donc des textures à ces pavés mais ils s'avère que l'ont voit à travers mes objets, comme si la texture était transparente. Comment puis-je résoudre ce problème ?

Merci par avance,
Cordialement,
Anz.

10 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
25 nov. 2008 à 05:21
Salut, avec Direct3D en C++ les fenêtres sont crées via l'API Win32 :

http://msdn.microsoft.com/en-us/library/ms632586(VS.85).aspx

Managed DirectX est maintenant remplacé par XNA mais tes connaissances de MDX ne sont pas perdues puisque XNA est basé sur Direct3D.

http://msdn.microsoft.com/en-us/xna/default.aspx
3
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
25 nov. 2008 à 16:10
[../auteur/ANSIZAK/1106703.aspx ansizak] ne perds pas ton temps à chercher des tutos directx sur le net:

Télécharger le DirectX sdk directement sur Microsoft, après t'as TOUT ce que tu cherche, mais vraiment hein! Microsoft se casse le cul pour créer des tutos débutants comme des tutos super avancés sur les shaders, sers t-en! En plus à chaque fois c'est des projets Visual Studio tout près à être utilisés.

Par exemple, créer une fenêtre, c'est un tuto disponible! Sers toi du browser:
3
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
23 nov. 2008 à 16:39
Salut:
1. Abandonne DirectX avec .NET: c'est un projet officiellement annulé par MS.
2. Pour ton probleme, as-tu vérifié que tu ne passe pas une couleur d'alpha quand tu dessine?
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
24 nov. 2008 à 00:20
Ok...
Je n'ai pas vraiment saisi ton point 2.
Et qu'entend tu par "c'est un projet officiellement annulé par MS" exactement ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
24 nov. 2008 à 02:31
DirectX pour .NET est abandonné par MS. Les dernières versions du SDK ne le comporte pas: donc tu dev avec une technologie que microsoft ne compte pas supporter à l'avenir. Il va falloir revenir au C++ :)

Pour en revenir à la transparence, typiquement tes vertex ont un attribut color qui est un dword (donc 32bits), avec RGBA.
Donc tu définis ça avec 0xRRGGBBAA

Si tu ne veux pas d'alpha mets AA à 0xFF. Pour appliquer une texture sur un quad (je suppose que c'est ce que tu fais), vérifie que la couleur de tes vertex est bien à 0xFFFFFFFF.
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
24 nov. 2008 à 15:58
Et bien merci pour tes informations.. Je me mettrais au C++, mais je dois avouer que pour le moment je ne sais pas trop par où commencer.
Par contre je n'applique pas réellement de texture directement sur un quadrillatère.. Je débute, je ne savais même ps qu'il était possible de définir un quadrillatère, je me contente de les créer des triangle strip via des CustomVertex.PositionTextured et j'applique une partie de la texture sur chaque triangle..

Je n'ai toujours pas vraiment compris quelle propriété contient l'information qui précise si ma texture contient un canal alpha...

Voici un extrait de code qui permet de générer un pavé:

VertexBuffer[,] buf = new VertexBuffer[i, j];
           
            //Pour chaque ligne de la carte
            for (int l = 0;l<i;l++)
            {
                //pour chaque colonne de la carte
                for (int m = 0; m < j; m++)
                {
                    //creation du buffer [ligne,colonne] correpondant à une tuile
                    buf[l, m] = new VertexBuffer(typeof(CustomVertex.PositionTextured), 30, device, 0, CustomVertex.PositionTextured.Format, Pool.Default);
                    CustomVertex.PositionTextured[] tile = (CustomVertex.PositionTextured[])buf[l, m].Lock(0, 0);

                    // 2 triangles par face
                    tile[0].Position = new Vector3(l, 0.5f + (float)(0.2*hights[l,m]), -m);
                    tile[0].Tv = 0.0f;
                    tile[0].Tv = 0.0f;

                    tile[1].Position = new Vector3(l, 0.0f, -m);
                    tile[1].Tu = 0.0f;
                    tile[1].Tv = 1.0f;

                    tile[2].Position = new Vector3((l + 1), 0.5f + (float)(0.2*hights[l,m]), -m);
                    tile[2].Tu = 1.0f;
                    tile[2].Tv = 0.0f;

                    tile[3].Position = new Vector3((l + 1), 0.0f, -m);
                    tile[3].Tu = 1.0f;
                    tile[3].Tv = 1.0f;

                    tile[4].Position = new Vector3((l + 1), 0.5f + (float)(0.2*hights[l,m]), -(m + 1));
                    tile[4].Tu = 2.0f;
                    tile[4].Tv = 0.0f;

                    tile[5].Position = new Vector3((l + 1), 0.0f, -(m + 1));
                    tile[5].Tu = 2.0f;
                    tile[5].Tv = 1.0f;

                    tile[6].Position = new Vector3(l, 0.5f + (float)(0.2*hights[l,m]), -(m + 1));
                    tile[6].Tu = 3.0f;
                    tile[6].Tv = 0.0f;

                    tile[7].Position = new Vector3(l, 0.0f, -(m + 1));
                    tile[7].Tu = 3.0f;
                    tile[7].Tv = 1.0f;

                    tile[8].Position = new Vector3(l, 0.5f + (float)(0.2*hights[l,m]), -m);
                    tile[8].Tu = 4.0f;
                    tile[8].Tv = 0.0f;

                    tile[9].Position = new Vector3(l, 0.0f, -m);
                    tile[9].Tu = 4.0f;
                    tile[9].Tv = 1.0f;

                    //base
                    tile[10].Position = new Vector3(l, 0.5f + (float)(0.2*hights[l,m]), -m);
                    tile[10].Tu = 0.0f;
                    tile[10].Tv = 0.0f;

                    tile[11].Position = new Vector3((l + 1), 0.5f + (float)(0.2*hights[l,m]), -m);
                    tile[11].Tu = 0.0f;
                    tile[11].Tv = 1.0f;

                    tile[12].Position = new Vector3(l, 0.5f + (float)(0.2*hights[l,m]), -(m + 1));
                    tile[12].Tu = 1.0f;
                    tile[12].Tv = 0.0f;

                    tile[13].Position = new Vector3((l + 1), 0.5f + (float)(0.2*hights[l,m]), -(m + 1));
                    tile[13].Tu = 1.0f;
                    tile[13].Tv = 1.0f;

                    buf[l, m].Unlock();

                }
            }

Peut-être pourras tu me préciser ou je doit définir l'absence de canal alpha.

Merci à toi,

Cordialement,
Anz
0
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
24 nov. 2008 à 16:29
Oui un quad est formé de 2 triangles, donc c'est normal :)

Par contre tu as des coordonnées certaines UV supérieures à 1, ce n'est pas correct.

La couleur de tes vertex est un attribut de CustomVertex. Je ne sais aps comment tu as déclaré tes vertex, car tu peux mettre un peu ce que tu veux dedans.

Tiens un petit exemple en C++:
http://www.two-kings.de/tutorials/dxgraphics/dxgraphics07.html

D'ailleurs je me suis mélangé les pinceaux avec OpenGL, dans directx les couleurs c'est ARGB, et non pas RGBA.

Tu devrais reprendre les tutoriaux de base fournis avec le SDK et reprendre morceau par morceau: dessiner un triangle, un quad, texturer un quad avec des coordonnées UV :p
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
24 nov. 2008 à 19:57
Salut à toi, je vais regarder tes liens de ce pas.
Pour les coordonnées de textures supérieures à 1, c'est possible, cela me permet de dupliquer la texture (en commençant à 1 et en allant juqu'à 2 c'est comme si j'allais de 0 à 1, cela peut paraitre tordu, mais ça me permet de mettre en relation les sommets de mon pavé avec leurs textures).

Tu m'a donnée un coup de motive, je me suis lancé dans le C++, je vais essayer de recréer mon projet dans ce langage. Mais pour le moment les tutos que j'ai suivis mentionnent surtout la SDL en ce qui concerne le traitement d'image.
Pour la creation de fenetre dois-je passer par la SDL ou bien DirectX permet-t-il de gérer cela lui-même ?
0
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
25 nov. 2008 à 16:12
Tu vas voir qu'en dehors de cette gestion de fenêtre très bas niveau tu vas retrouver +/- ce que tu as vu en C#. DirectX pour C# c'était juste une sorte de wrapper pour l'API native, tu ne seras pas perdu.
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
25 nov. 2008 à 16:21
Salut à vous et merci.


Pour Lutinore, j'avais déjà jeté un coup d'oeil au XNA, mais j'avais eu l'impression de manquer de liberté quant à l'agencement des methodes
(update du terrain etc) mais effectivement ça peut valoir le coup.

Et merci bubba, ça m'a l'air bien propre ce que tu me montre là, mais j'avais déjà recherché mais trouvé le SDK uniquement pour DirectX 10 et non 9.
Je vais continuer mes recherches dans cette voie.

Merci encore,

Cordialement,
Anz.
0
Rejoignez-nous