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 :

Pb Affichage Managed DirectX en C#


Sujet :

DirectX

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Par défaut Pb Affichage Managed DirectX en C#
    Bonjour,

    J'ai un problème d'affichage que je n'arrive pas à résoudre depuis quelques jours déjà.

    Dans mon projet, je génère des objets 3D par révolution (équivalent de la fonction 'lathe' dans 3DSMax), cependant j'obtiens un résultat bizarre au niveau du clipping:



    au bout d'un moment les faces cachées apparaissent (sous un certain angle de rotation en fait).

    Je crée les objets en utilisant un customvertex, et je place les données dans un vertexbuffer par la suite. Pour l'affichage j'utilise DrawPrimitive avec l'option TriangleList.

    Avez-vous une idée de la raison pour laquelle j'obtiens un tel affichage?

  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
    On dirait un Z-Buffer mal paramétré.

    Tu peux nous montrer tout ce qui s'y rapporte dans ton code ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Par défaut
    Surtout la partie rendu?

    enfin voilà la partie rendu déjà, c'est temporaire (justement à cause du problème)

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
                m_device.Transform.World = Matrix.RotationYawPitchRoll(anglex, angley, 0);
     
                // Activation de la prise en charge de la lumière par notre scène
                m_device.RenderState.ZBufferEnable = true;
                m_device.RenderState.ZBufferFunction = Compare.GreaterEqual;
                m_device.RenderState.CullMode = Cull.CounterClockwise;
                //m_device.RenderState.StencilEnable = true;
                //m_device.RenderState.StencilFunction = Compare.LessEqual;
                //m_device.RenderState.StencilPass = StencilOperation.IncrementSaturation;
                m_device.RenderState.Lighting = true;
                //m_device.RenderState.FillMode = FillMode.WireFrame;
                m_device.RenderState.ShadeMode = ShadeMode.Phong;
                m_device.RenderState.Ambient = Color.FromArgb(0x00, 0x30, 0x30, 0x30);
     
                //On ajoute une lumière
                m_device.Lights[0].Type = LightType.Directional;
                m_device.Lights[0].Diffuse = Color.AliceBlue;
                m_device.Lights[0].Direction = new Vector3(0.5f, -1f, 0.5f);
                m_device.Lights[0].Commit();
                m_device.Lights[0].Enabled = true;
     
                m_device.Transform.World = Matrix.RotationYawPitchRoll(anglex, angley, 0);
                m_device.Transform.View = Matrix.LookAtLH(new Vector3(0, 8, -30),
                  new Vector3(0, 0, 0), new Vector3(0, 1, 0));
                m_device.Transform.Projection =
                  Matrix.PerspectiveFovLH((float)Math.PI / 4.0F, 1.55F, 0.2F, 1000.0F);
     
                m_device.VertexFormat = VertexFormats.Position | VertexFormats.Normal;
                #endregion
     
     
                foreach (CObjet3D obj3d in mlst_Obj3D)
                {
                    m_device.Material = mlst_Materiel.GetMateriel(obj3d.IdMateriel);
                    VertexBuffer vb = new VertexBuffer(typeof(CustomVertex.PositionNormal), obj3d.Mesh.NbVerts, m_device, Usage.WriteOnly, CustomVertex.PositionNormal.Format, Pool.Managed);
                    vb.SetData(obj3d.Mesh.cv, 0, LockFlags.None);
     
                    m_device.SetStreamSource(0, vb, 0);
                    m_device.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)(obj3d.Mesh.NbVerts / 6));
                    while (!vb.Disposed)
                    {
                        vb.Dispose();
                    }
                    //ShowNormals(obj3d.Mesh.cv, obj3d.Mesh.NbVerts);
                }
     
                //Fin du rendu
                m_device.EndScene();
     
                m_device.Present();     //On affiche le rendu
                return cst_OK;
    j'ai essayé juste en activant le zbuffer, mais pas de meilleur résultat.
    D'ailleurs si je le désactive explicitement, l'affichage reste le même.....

    Tu penses donc que ça vient du ZBuffer?
    Est-ce que ça pourrait venir d'autre chose, lors de la génération de la forme par exemple?

    En tout cas merci pour la réponse

  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
    La fonction de comparaison Z devrait être LessEqual. Le mieux est encore de laisser la valeur par défaut si tu veux être sûr de ne pas te tromper.

    Si ça ne résoud pas le problème, tu peux nous montrer tes PresentParameters ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Par défaut
    les voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                pObj_p = new PresentParameters();
     
                pObj_p.Windowed = true;                      //Mode fenêtré
                pObj_p.SwapEffect = SwapEffect.Discard;      //Mode de changement de buffer
    Et effectivement, ça ne change pas le problème. J'ai essayé avec tous les flags possibles et je ne voie aucune différence.

    Autre chose, lorsque je fais un Clear sur le device de Direct3D, je ne peux pas mettre le flag ZBuffer, cela me génère une exception DirectX.....

    Est-ce que ça pourrait être lié au problème?

  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
    On dirait que oui.

    Dans tes PresentParameters il faut paramétrer le Z-Buffer :

    AutoDepthStencilFormat pour spécifier son format.
    EnableAutoDepthStencil pour dire que tu l'utilises.

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

Discussions similaires

  1. Avis livre managed directx 9
    Par skysee dans le forum DirectX
    Réponses: 3
    Dernier message: 09/03/2008, 14h36
  2. Réponses: 2
    Dernier message: 08/11/2007, 17h49
  3. Managed DirectX - Lire un fichier audio
    Par Herwin78800 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/08/2007, 19h02
  4. [Managed Directx C#] un gros bug indébuggable
    Par backfire dans le forum DirectX
    Réponses: 8
    Dernier message: 28/02/2007, 10h19
  5. [Tutoriel Managed DirectX] Y aura-t-il une suite ?
    Par Thorna dans le forum Général Dotnet
    Réponses: 7
    Dernier message: 02/08/2006, 17h28

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