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 :

[Direct X 9.0] Probleme mesh


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut [Direct X 9.0] Probleme mesh
    Bonjour à tous,

    Voila, j'ai un problème asser étrange, et avec mes maigres connaissances de L'API DirectX, il m'est difficile de la résoudre seul.

    Alors voila, pour etre bref, j'ai un problème lors du rendu de mes mesh (tous), et ca plante sur un classique Mesh->DrawSubset(i), où i parcourt le nombre de matériaux.

    Alors quand je debug, je vois un nombre de matériaux cohérent (1 seul, et c'est bien le cas de mon mesh).
    Je vois aussi des structures pour mon mesh qui semblent etre cohérentes (pas d'adresse du genre 0x0000000).
    Ma texture est bien en place elle aussi, mon tableau de matériaux contient des valeurs cohérentes, bref, tout porte à croire que l'initialisation de mon mesh s'est bien passé.

    Ha oui, je charge mon mesh à partir d'un .X, part la methode D3DXLoadMeshFromX().

    Pour etre précis : voila un peu plus de code :

    Init de mon Device 3D :
    -------------------

    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
    /* Crée l'objet Direct3D */
    	if( NULL == (objetDirect3D = Direct3DCreate9(D3D_SDK_VERSION )))
    	{
    		return E_FAIL;
    	}
     
    	D3DPRESENT_PARAMETERS d3dpp;
    	ZeroMemory( &d3dpp, sizeof(d3dpp) );
    	d3dpp.Windowed = TRUE;
    	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    	d3dpp.BackBufferCount = 1;
    	d3dpp.EnableAutoDepthStencil = TRUE;
    	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
     
    	/* Crée le device3D */
    	if( FAILED( objetDirect3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, fenetre, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device3D )))
    	{
    		return E_FAIL;
    	}
     
    	if( FAILED( device3D->SetRenderState( D3DRS_ZENABLE, TRUE )))
    	{
    		return E_FAIL;
    	}
     
    	if( FAILED( device3D->SetRenderState( D3DRS_AMBIENT, 0xffffffff )))
    	{
    		return E_FAIL;
    	}
     
    	return S_OK;
    voila le code du chargement de mon mesh :
    ---------------------------------------

    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
    MeshDevice = ( engine->affichage.GetDevice() );
    	NumMaterials = 0L;
    	LPD3DXBUFFER pD3DXMtrlBuffer = NULL;
     
    	if( FAILED( D3DXLoadMeshFromX( nomMesh, D3DXMESH_SYSTEMMEM, MeshDevice, NULL, &pD3DXMtrlBuffer, NULL, &NumMaterials, &Mesh ) ) )
    	{
    		// Génerer erreur
    		return(E_FAIL);
    	}
     
    	D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
    	MeshMaterials = new D3DMATERIAL9[NumMaterials];
    	MeshTextures = new LPDIRECT3DTEXTURE9[NumMaterials];
     
    	for(DWORD i=0; i<NumMaterials; i++)
    	{
    		MeshMaterials[i] = d3dxMaterials[i].MatD3D;
    		MeshMaterials[i].Ambient = MeshMaterials[i].Diffuse;
    		MeshTextures[i] = NULL;
    		if( d3dxMaterials[i].pTextureFilename != NULL && lstrlen(d3dxMaterials[i].pTextureFilename) > 0)
    		{
    			if( FAILED( D3DXCreateTextureFromFile(MeshDevice, d3dxMaterials[i].pTextureFilename, &MeshTextures[i])))
    			{
    				// Générer erreur
    				return(E_FAIL);
    			}
    		}
    	}
     
    	pD3DXMtrlBuffer->Release();
     
     
     
    	return S_OK;

    Et voila le code du rendu de mon mesh :
    ------------------------------------

    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
    for( DWORD i=0; i<NumMaterials; i++)
    	{
    		if( FAILED( (MeshDevice)->SetMaterial(&MeshMaterials[i]) ))
    		{
    			return( false );
    		}
     
    		if(FAILED( (MeshDevice)->SetTexture(0, MeshTextures[i]) ))
    		{
    			return( false );
    		}
     
    		if(FAILED( Mesh->DrawSubset(i) ))
    		{
    			return( false );
    		}
     
    	}
     
     
    	return(true);

    Je précise que les fonctions d'init du device 3D et du mesh renvoit toutes les deux S_OK, donc à aparemment pas de probleme...

    Et au niveau du rendu, ca foire sur DrawSubset, avec l'erreur suivante :

    Exception de première chance à 0x7c812a5b dans scene.exe : Exception Microsoft C++ : long à l'emplacement mémoire 0x0012f2f0..

    (et le programme continue à tourner, sans bien sur dessiner mes meshs, juste mon joli fond noir...)

    (sous Visual C++ Express 2008)



    J'avoue que j'ai beaucoup de mal à comprendre, puisque tout semble etre OK, aucune valeur concernant mon mesh ne semble etre incohérente, et toutes les init on l'air de fonctionner...

    1/Alors j'ai pensé aux flags...
    Donc est-ce que vous pouvez me dire si mes flags de création du device et du mesh sont cohérents ?
    J'avoue que je sais jamais trop lequels mettre.
    Là j'ai mis ceux que je lis partout sur le net.
    Meme si en terme d'optimisation c'est pas terrible, est-ce que ca davrait marcher ainsi ?


    2/ Ou sinon j'ai pensé au device 3D.
    Bon en fait ma scene utilise un device 3D, et lorsque je crée un mesh je passe ce device.
    Mais comme je crois qu'un device n'est qu'un pointeur, je ne le passe pas par adresse, je le passe directement.
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    LPDirect3DDevice9 Moteur::GetDevice()
    {
    return (device3D);
    }
     
    avec : 
    class Moteur
    {
    LPDirect3DDevice9 device3D;
    //...
    }

    Et mes meshs recuperent le device do moteur par cette fonction.
    (en fait exactement c'est la ligne MeshDevice = (engine->affichage.GetDevice() ) )


    Est-ce qu'il est possible de passer un device3D comme cela ?
    J'ai bien raison de penser que je peux "assigner" un meme device3D à plusieur objets mesh hein ?

    Enfin voila, si qq peut m'éclairer et me donner qq pistes, c'est pas de refus...
    :p

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Pour un peu plus de précision, voila la code machine équivalent à l'appel de DrawSubset qui plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    004DBFBC  mov         esi,esp 
    004DBFBE  mov         eax,dword ptr [i] 
    004DBFC1  push        eax  
    004DBFC2  mov         ecx,dword ptr [this] 
    004DBFC5  mov         edx,dword ptr [ecx+4] 
    004DBFC8  mov         eax,dword ptr [this] 
    004DBFCB  mov         ecx,dword ptr [eax+4] 
    004DBFCE  mov         edx,dword ptr [edx] 
    004DBFD0  push        ecx  
    004DBFD1  mov         eax,dword ptr [edx+0Ch] 
    004DBFD4  call        eax  
    004DBFD6  cmp         esi,esp 
    004DBFD8  call        @ILT+14575(__RTC_CheckEsp) (4C28F4h) 
    004DBFDD  test        eax,eax
    Et là où ca génere <le Exception de première chance à 0x7c812a5b dans scene.exe : Exception Microsoft C++ : long à l'emplacement mémoire 0x0012f2f0.. > c'est précisemment sur le "call eax".

    Ca sent pas le débordement de tampon ca ?
    (jsuis absolument pas un expert en assembleur, juste une idée comme ca... :-) )

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Personne pour me donner un petit avis ?

    Peut etre que je n'ai pas été clair sur le probleme, et dans ce cas je peux tenter de le ré-expliquer.

    Je n'arrive vraimment pas à comprendre pourquoi mon DrawSubset ne marche pas...

    Merci à tous

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    A vue de nez c'est que l'objet 3d ou mesh est mal généré au format .x soit il est trop gros trop de sommets et facettes soit il est mal généré par l'outil 3d.
    ll faut essayer de le charger dans un utilitaire de visualisation d'objets 3d..
    Il ya certainement d'autres pistes mais si tu as des erreurs sur le fichier mesh je pense que c'est cela à privilégier

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Merci pour votre réponse,

    Malheureusement, ca ne peut pas venir d'un probleme sur le fichier .X pour la simple et bonne raison qu'il est issu du pack DXSDK, il s'agit du classique "tiger.x".

    Et bien sur, quand je le visualise avec le Mexh Viewer, il n'y a aucun probleme.
    Et ces morceaux de code fonctionnaient très bien avant la réorganisation de mon (jeune) moteur 3D. J'ai juste rajouté un peu d'abstraction et séparé ce qui dépend de l'API de ce qui en est invariant, et c'ets à peu près tout.

    Je m'attend à une erreur très bete, mais pour l'instant je ne la trouve pas...

    Un detain, si je fais Mesh->GetNumFaces() dans mon code, après le chargement, ca me donne boen le nombre de faces du mesh (que je connais justement grace au Mesh Viewer).

    Donc apparemment le Mesh est bien chargé...

    Bizare quand meme, pourquoi ne puis-je pas l'afficher alors ?


    Je continurais à chercher demain, et reposterais pour donner des nouvelles, mais si qq a d'autres pistes, c'est cool.

    Merci à tous

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Par défaut erreur Draw Subset ->
    J'ai eu ce type de problème avec les fichiers.x .

    Il s'agissait souvent du fait que le nom de la texture dans le fichier .x ne correspond pas au chemin du fichier sur le disque.
    Avec tiger.x, le fichier est "tiger.bmp".
    Vérifie le nom des textures chargées lors du chargement du mesh dans ton prgm.
    Modifie le chemin du fichier texture dans le fichier .x , soit par éditeur, soit en partant d'un export de 3Ds en .x, en ayant manuellement importé les textures avec le bon chemin dans 3DS.

    Espèrant que ça peut t'aider

    a+

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

Discussions similaires

  1. probleme avec mesh
    Par tenderstoune dans le forum MATLAB
    Réponses: 5
    Dernier message: 20/03/2007, 00h16
  2. Probleme avec la recherche directe de methodes sur une Class (API java.lang.reflect)
    Par CyberChouan dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 25/01/2007, 17h12
  3. [Directives] Problème register_globals
    Par made_in_france dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 30/04/2006, 11h34
  4. probleme lumiere position & direction
    Par damienlann dans le forum OpenGL
    Réponses: 8
    Dernier message: 25/04/2006, 15h15
  5. Problemes de compilations exemple createdevice.cpp de Direct
    Par Maverick357 dans le forum DirectX
    Réponses: 8
    Dernier message: 03/02/2005, 15h29

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