bonjour
je créé une sphère avec D3DXCreateSphere,
qui possède donc comme FVF : D3DFVF_XYZ | D3DFVF_NORMAL
je clone ce mesh avec un nouveau FVF:
déclaration du nouveau FVF :
clonage du 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 #define D3DFVF_SPHEREMESHVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DFVF_TEX0 ) // struct SPHEREMESHVERTEX { D3DXVECTOR3 Position; D3DXVECTOR3 Normale; D3DXVECTOR3 Couleur; D3DXVECTOR2 UVTex0; const static D3DVERTEXELEMENT9 Decl[5]; }; const D3DVERTEXELEMENT9 SPHEREMESHVERTEX::Decl[] = { { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, { 0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, { 0, 36, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() };
jusque là tout va bien:
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 hr = D3DXCreateSphere( pd3dDevice, 50.0f, // Radius, 64, // UINT Slices, 64, // UINT Stacks, &pSphereMesh, NULL ); if ( hr == S_OK ) OutputDebugString( L"D3DXCreateSphere ok \n" ); else OutputDebugString( L"D3DXCreateSphere échoué \n" ); // clonage spheremesh hr = pSphereMesh->CloneMeshFVF( pSphereMesh->GetOptions()|D3DXMESH_MANAGED, D3DFVF_SPHEREMESHVERTEX, // FVF demandé pd3dDevice, // device &g_pCloneSphereMesh // pointeur vers mesh cloné ); if ( hr != S_OK ) OutputDebugString(TEXT("erreur clone sphere mesh\n") ); else OutputDebugString(TEXT("clonage sphere mesh ok\n") ); if ( pSphereMesh ) SAFE_RELEASE( pSphereMesh ); // libération mesh original
puis je veux verrouiller le vb pour y accéder et remplir la couleur et les coordonnées de texture
pour vérifier mes valeurs, je fais :
j'obtiens :
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 LPDIRECT3DVERTEXBUFFER9 pVB = NULL; VerifHR( g_pCloneSphereMesh->GetVertexBuffer( &pVB)); // acquiert pointeur buffer mesh cloné int nb_vertices = (int)(g_pCloneSphereMesh->GetNumVertices()); // nb de vertices du mesh DWORD vFVF=g_pCloneSphereMesh->GetFVF(); // acquiert FVF DWORD stride = D3DXGetFVFVertexSize (vFVF); // taille d'un vertice // vérification UINT spherevertex_size = D3DXGetFVFVertexSize(D3DFVF_SPHEREMESHVERTEX); // taille vertice demandée DWORD vertex_size = g_pCloneSphereMesh->GetNumBytesPerVertex(); // taille vertice buffer mesh cloné D3DVERTEXBUFFER_DESC desc; VerifHR( pVB->GetDesc( &desc)); UINT buffer_size = desc.Size; // longueur buffer mesh cloné
nb_vertices = 4034
stride = 28
spherevertex_size = 28
vertex_size =28
buffer_size = 112952
soit nb_vertices * spherevertex_size
le VB a donc l'air ok
je veux maintenant verrouiller le VB et accéder aux valeurs pour les modifier
avec ce code :
et la, j'obtiens des valeurs à 0, et si je veux modifier une valeur dans le buffer,
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 SPHEREMESHVERTEX* pVertex; // pour copier le vb du mesh VOID* pVertices; // zone mémoire à copier // verouillage du VB hr = pVB->Lock( 0, // offset ( décalage ) dans le vb 0, // taille à verrouiller 0 = tout (void **)&pVertices, 0 // pas de drapeau spécifique de verouillage ); if ( hr != D3D_OK ) OutputDebugString( L" pVB->Lock échoué\n" ); else OutputDebugString( L"pVB->Lock ok\n" ); // copy en mémoire du VB du mesh memcpy( &pVertex, pVertices, sizeof(pVertices)); // debug valeur vertex wchar_t sz[256]; for ( int i = 0; i<nb_vertices; i++) { StringCchPrintfW( sz, 256, L"i: %d pos: %0.2f %0.2f %0.2f color: %0.2f \n", i, &pVertex->Position.x, &pVertex->Position.y, &pVertex->Position.z, &pVertex->Couleur.x ); OutputDebugString( sz ); pVertex++; // vertice suivant } // déverrouillage VB hr = pVB->Unlock(); if ( hr != D3D_OK ) OutputDebugString( L" pVB->Unlock échoué\n" ); else OutputDebugString( L"pVB->Unlock ok\n" ); if ( pVB ) pVB->Release();
j'ai une violation d'écriture
j'ai essayé d'accéder au valeurs des vertex via :
avec un erreur de violation mémoire pour résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 pVertex[i].Position.x
donc je m'y prends mal:
durant le verrouillage du buffer,
durant le memcpy() ou l'accès aux vertex, ou les trois ??
dans les exemples on ne trouve que des créations de VB suivi de modifications, mais pas d'exemple de clonage de mesh avec modification de FVF et des valeurs du VB.
je crois que je mélange des trucs
un peu d'aide serait bienvenue
merci d'avance
Partager