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 :

[C#] Affichage foireux des meshs


Sujet :

DirectX

  1. #1
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut [C#] Affichage foireux des meshs
    Bonjour

    Je me suis mis au C# recement pour faire du DirectX ...
    Mais me voila déjà confronté a un probleme
    En effet, j'arrive a créer mon affichage, afficher des primitives (triangles) etc, faire un peu mumuse avec l'éclairage, tout va bien...

    Mais des que je fais Intervenir un Mesh, là rien ne va plus
    En effet, tout d'abord il apparait comme si les normales étaient inversées, et ensuite, comme si il y avait des faces a l'intérieur de mon mesh (Et oui puisque je peux voir l'intérieur du mesh mais pas l'extérieur :o)...
    Et pour en rajouter une couche, si je créé mon mesh avec DirectX (MonMesh = Mesh.Teapot(device)), ca me fait pareil, mais en plus je vois les parties du mesh se monter dessus :o
    Bref, c'est la grosse galere et le gros n'importe quoi !

    Tout d'abord, une image pour montrer le probleme en pleine action ...


    Et au niveau du code:

    Initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    		public void InitializeDevice()
    		{
    			//PresentParameters pour le Device
    			presentParams = new PresentParameters();
    			presentParams.Windowed = true;
    			presentParams.SwapEffect = SwapEffect.Discard;
    			presentParams.PresentationInterval = PresentInterval.Immediate;
     
    			device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
     
    			//Mesh
    			MonMesh = Microsoft.DirectX.Direct3D.Mesh.FromFile(Application.StartupPath+"\\meshes\\torus.x",MeshFlags.Managed,device,out materials )
    		}
    OnIdle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    		private void OnIdle(object sender, System.EventArgs e)
    		{
    			//Caméra
    			device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI/4, (this.Width/this.Height), 0.1f, 500000f);
    			device.Transform.View       = Matrix.LookAtLH(new Vector3(0,50,50), new Vector3(0,0,0), new Vector3(0,-1,0));
    			device.RenderState.CullMode = Cull.None;
    			device.Transform.World = Matrix.RotationZ(angle);
     
    			//Clear
    			device.Clear(ClearFlags.Target,Color.FromArgb(60,60,70),1.0f,0);
     
    			this.SetText();
    			Frames++;
     
    			device.BeginScene();
    				//Eclairage
    			        device.Lights[0].Type = LightType.Directional;
    			        device.Lights[0].Direction = new Vector3((float)Math.Cos(Environment.TickCount / 250.0f), 1.0f, (float)Math.Sin(Environment.TickCount / 250.0f));
    			        device.Lights[0].Diffuse = Color.FromArgb(235,230,255);
    			        device.Lights[0].Enabled = true;
     
    			        //Dessiner le mesh
    			        for (int i=0; i<=materials.Length-1; i++)
    			        {
    				       device.Material = MonMeshMaterials[i].Material3D;
    				       MonMesh.DrawSubset(i);
    			        }
     
    				this.DrawText();
    			device.EndScene();
     
    			device.Present();
    			this.Invalidate();
    		}
    J'espere que vous pourrez m'aider rapidement, car ca me rpend la tete depuis le début d'aprem

    Merci d'avance a tous!

    Ingham

  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
    Je dirais que tu as soit oublié d'activer le Z-Buffer, soit inversé l'ordre de culling. Vu ton code et le screen, je pencherais plutôt pour le Z-Buffer.

  3. #3
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Merci pour la réponse rapide

    Mais meme si je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device.RenderState.ZBufferEnable = true;
    Où que ce soit, ca change rien

    Et pour le Cull, j'ai essayé toutes les possibilitées (Clockwise, CounterClockwise et None), toujours ce résultat foireux
    Si je mets autre chose que None, on ne voit plus les polygones a l'intérieures du mesh, mais on a toujours cette fausse impression que le mesh se passe par dessus lui même (dur a expliquer)

    Je post les binaries pour mieux m'exprimer:
    http://ingham.free.fr/stnovdec/DirectXTest.exe

    Ce se voit plus particulierement au niveau de la poignée, du bec et du petit chapo en haut
    Par exemple la poignée passe par dessus le reste du mesh quand elle est censée etre derriere

    Et ca fait pareil pour tous les meshs

    Une idée ? :/

    Merci encore je m'attendais pas a une réponse aussi rapide

  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
    Ton exe provoque une exception chez moi (FileNotFound).

    Sinon, pour le ZBuffer essaye aussi d'ajouter ça (en C++, je te laisse faire la conversion en C#) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    presentParams.AutoDepthStencilFormat = D3DFMT_D16;
    presentParams.EnableAutoDepthStencil = true;
    Merci encore je m'attendais pas a une réponse aussi rapide
    Citation Envoyé par Quelqu'un, un jour,
    je suis en tp d'info et ça va vachement plus vite de poser une question ici que de la poser au prof
    Developpez, le forum qui dégaine plus vite que son ombre 8)

  5. #5
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Oui j'avais vu ca dans une aide
    Mais lorsque je le mets ...
    C'est encore pire

    Image:



  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
    Cette fois je dirais que dans ton Device.Clear tu oublies le bit de ZBuffer

  7. #7
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Pas bête !

    En effet ca a l'air de marcher comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    device.Clear(ClearFlags.ZBuffer,Color.FromArgb(60,60,70),1f,0);
    device.Clear(ClearFlags.Target, Color.FromArgb(60,60,70),1f,0);
    Mais a quoi correspondent ces valeures ?
    Car apparement ce ne fait plus effet si je met la camera trop loin

    Mais merci beaucoup le gros du probleme est reglé grace a vous

  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
    Il vaut mieux tout effacer en un seul appel en combinant les flags :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer,Color.FromArgb(60,60,70),1f,0);
     
    // Ou bien "Or" à la place de "|" en C# ?
    Le premier paramètre spécifie les surfaces à effacer (color buffer, Z-buffer, stencil buffer), puis les suivants indiquent avec quelles valeurs effacer ces buffers. Là tu mettras du gris sur ton color buffer, tu mettras à 1 ton Z-Buffer (là tu n'as pas trop le choix, sauf si tu veux faire des effets bizarroïdes), puis enfin tu mettras ton Stencil Buffer à zéro (enfin non, puisque tu n'as pas spécifié le flag ClearFlags.StencilBuffer).

    Mais tout ceci est très bien expliqué dans la doc du SDK .

    Car apparement ce ne fait plus effet si je met la camera trop loin
    Tu as défini un espace 3D pour ta scène (un cone tronqué, voir la doc pour les ptits schémas), notamment un plan rapproché et un plan éloigné. Si ta caméra sort de cet espace tu ne verras plus ta scène. Et aussi si ton plan rapproché est trop proche (0 par exemple, erreur classique), tu auras des effets bizarres au niveau du Z-Buffer.

  9. #9
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup !

    J'avais un peu peur en postant sur le forum DirectX car je voyais qu'il n'y avait pas grand monde dessus, mais ce sont des personnes compétentes et mon probleme a été réglé tres vite !

    Merci a vous Loulou24

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/03/2009, 00h56
  2. pb d'affichage de matériaux/mesh
    Par backfire dans le forum DirectX
    Réponses: 11
    Dernier message: 23/12/2004, 05h23
  3. Réponses: 6
    Dernier message: 19/10/2004, 13h46
  4. logiciel creant des meshes
    Par gaut dans le forum DirectX
    Réponses: 14
    Dernier message: 14/09/2004, 01h27
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

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