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 :

Meshes clignotantes ! (2)


Sujet :

DirectX

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut Meshes clignotantes ! (2)
    J'ai toujours se problème de meshes clignotantes !
    La scène est pourtant très simple : on s'éloigne progressivement d'une planète...
    Ce qui est étrange c'est qu'en fonction de la direction de déplacement, la planète disparait toutes les 5 ou 6 images ce qui provoque une impression de clignotement assez désagreable.
    J'ai vérifié en détail le calcul des matrices World, View et projection avec D3DSpy et il n'y a pas d'erreur dans les calculs lorsque cela se produit...

    En mode refrast, j'obtiens la même chose...

    J'ai l'impression que le ZBuffer à un rôle la-dedans : losque je change la valeur du paramètre D3DRS_ZFUNC, l'effet s'atténue ou augmente au contraire...

    Enfin, j'utilise la commande
    _device->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
    pour les calculs avec les lumières...

    J'ai a priori également bien paramétré les valeurs des plans lointains et approchés de la perspective...

    Avec mes remerciements,

    Franck

  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
    Tu pourrais mettre un peu de code si c'est pas trop gros ?

    Quand tu dis que ça change quand tu modifies le ZFUNC, ça fait quoi exactement quand tu mets quelles valeurs ?

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut Code...
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    bool CWinStars2View::resize(int width, int height)
    {
        D3DXMATRIX m;
     
        float aspect = (float)width / (float)height;
     
        float fov = 0.847197f;
     
        D3DXMatrixPerspectiveFovLH(
    		&m, 
    		fov, 
    		aspect,
    		1.0f,
    		1e30f);
     
         if( _device )
               _device->SetTransform(D3DTS_PROJECTION, &m);
     
         return true;
    }
     
    bool CWinStars2View::update(float timeDelta)
    {
         //on éloigne la planéte d'un facteur 1.000001 sur l'axe des x pour créer une petite animation
     
         Planete[2][18]*=1.000001;
     
         return true;
    }
     
     
     
     
    bool CWinStars2View::render()
    {
       D3DXMATRIX mat2,mat,mat3;
      char chaine[40];
     
        if( _device )
       {
       _device->Clear(0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0L);
     
         if (!FAILED(_device->BeginScene()))
         {
                D3DXMatrixIdentity(&mat);
     
                //Soleil
     
                D3DXMatrixScaling( &mat2, 696000.0, 696000.0, 696000.0 );
     
                _device->SetTransform( D3DTS_WORLD, &mat2);
     
                Soleil->Render(_device,TRUE,FALSE);
     
     
                //Terre	
     
                D3DXMatrixScaling( &mat2, 6384.0, 6384.0, 6384.0 );
                D3DXMatrixTranslation(&mat3,Planete[2][18],Planete[2][19],Planete[2][20]);			
     
                mat2*=mat;
                mat2*=mat3;
     
                _device->SetTransform( D3DTS_WORLD, &mat2 );
     
                Terre->Render(_device,TRUE,TRUE);
     
     
                _device->EndScene();		
     
                _device->Present(NULL, NULL, NULL, NULL);
                }
          }
     
          return true;
    }
     
    void CWinStars2View::OnMouseMove(UINT nFlags, CPoint point) 
    {
         static CPoint pointAnc;
     
         //on peut tourner autour de la terre si on appuie sur le bouton droit de la souris
         if (nFlags==MK_RBUTTON )
         {
            Deplacx-=(point.x-pointAnc.x); 
            Deplacy-=(point.y-pointAnc.y); 
     
            xob=Planete[2][18]+20000.0*cos(Deplacy)*sin(Deplacx);
            yob=Planete[2][19]+20000.0*cos(Deplacy)*cos(Deplacx);
            zob=Planete[2][20]+20000.0*sin(Deplacy);   
     
            D3DXMATRIX m;
     
            D3DXVECTOR3  eye(xob,yob, zob);
            D3DXVECTOR3  to(Planete[2][18], Planete[2][19],  Planete[2][20]);
            D3DXVECTOR3 look(0.0f, 1.0f,  0.0f);
     
            D3DXMatrixLookAtLH(&m, &eye, &to, &look);
     
           _device->SetTransform(D3DTS_VIEW,&m);
     
           } 
     
            pointAnc.x=point.x;
            pointAnc.y=point.y;
     
            CView::OnMouseMove(nFlags, point);
    }
    Voilà, le soleil est tracé normalement, mais la Terre (qui est au premier plan) clignote !

  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
    A priori y a rien qui puisse faire d'erreur dans ton code. Tu pourrais mettre en ligne une petite démo pour voir un peu ?

    Bon juste une remarque (qui ne fera pas avancer le schmilblick d'un poil) : ça sert à rien de multiplier par mat vu qu'elle vaut toujours l'identité

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Points : 78
    Points
    78
    Par défaut
    j'ai déjà eu ce problème... il faut créer un ZBuffer 24bits :
    d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8;

  6. #6
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    le plan lointain est trop loin. La valeur ne tiendra pas dans un float.

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut
    Merci à tous pour votre aide.
    J'ai suivi vos conseils mais malheureusement le problème persiste...

    C'est peut-être aussi un problème avec la création du périphérique 3D.
    Voici le code :


    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
    bool Graphics::create(HWND hwnd,  int width,  int height,  bool windowed)
    {
           // Creation du device
           if(NULL == (_d3d9 = Direct3DCreate9(D3D_SDK_VERSION)))
           {
               return false;
           }
     
           D3DDISPLAYMODE d3ddm;
           if(FAILED( _d3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
           {
                return false;
           }
     
           D3DPRESENT_PARAMETERS d3dpp;
           ZeroMemory(&d3dpp, sizeof(d3dpp));
     
           d3dpp.Windowed = TRUE;
           d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
           d3dpp.BackBufferFormat = d3ddm.Format;
     
           d3dpp.EnableAutoDepthStencil = FALSE;
           d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8
     
           // Creattion du device
           if(FAILED(_d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &_device)))
    	{
    		return false;
    	}	
     
    	return true;
    }
    J'ai essayé également de bien réduire la valeur du plan lointain.

    Merci

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Points : 78
    Points
    78
    Par défaut
    il faut pas mettre EnableAutoDepthStencil à true ? essaye pour voir...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut
    J'ai fait un essai avec la valeur sur TRUE. Ca ne marche pas (((

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut Ca marche !!! (problème résolu)
    Laurent, vous aviez raison.

    J'ai redimensionné toute la scène pour que le plan lointain soit à une distance raisonnable et maintenant ça marche parfaitement !
    Un grand merci à tous pour votre aide et votre patience et un grand merci pour l'existence ce forum !

  11. #11
    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
    en fait ce qui est surtout important dans la precision
    du zbuffer c'est le ratio zFar/Znear qui doit etre le plus petit possible (en tenant compte de ta scene et du clipping voulu) pour preserver le maximum d'efficacite du z buffer (ca peut vouloir dire rapprocher le z-far mais surtout éloigner le z-near).

    Note que si tu veux effectivement representer des distances astronomiques avec tout le niveau de détail associé il va falloir serieusement reviser l'utilisation du z-buffer qui risque d'etre inutilisable
    a cause de la perte de precision dans les grandes distances.
    (en gros toute la precision du z buffer est concentré dans une zone proche du plan Znear).

    LeGreg

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut
    Ok ! Je prends note !

    Merci...

Discussions similaires

  1. Rendu de mesh "murs"
    Par Dranor dans le forum DirectX
    Réponses: 10
    Dernier message: 21/02/2004, 11h23
  2. Un autre débutant ... désoler - Les mesh
    Par oxor3 dans le forum DirectX
    Réponses: 4
    Dernier message: 15/08/2003, 18h41
  3. Meshes clignotantes !
    Par Francky033 dans le forum DirectX
    Réponses: 3
    Dernier message: 30/07/2003, 15h19
  4. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34
  5. Mesh & Light
    Par MAx44 dans le forum DirectX
    Réponses: 4
    Dernier message: 27/04/2003, 11h11

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