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 :
-------------------
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 /* 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;
---------------------------------------
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
Partager