[DirectX]Afficher beaucoup d'objets

Signaler
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
-
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
-
Salut,

Je viens de me mettre à directx et j'ai un question.

Avec OpenGL on pouvait se faciliter la tâche en créant des displays lists, mais avec directx comment peut on faire ???

Je crée un objet comme cela :

g_pd3dDevice->CreateVertexBuffer( 4*sizeof(Vertex), D3DUSAGE_WRITEONLY, 
                                      D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, 
                                      &g_pVertexBuffer, NULL );
    void *pVertices = NULL;

    g_pVertexBuffer->Lock( 0, sizeof(g_quadVertices), (void**)&pVertices, 0 );
    memcpy( pVertices, g_quadVertices, sizeof(g_quadVertices) );
    g_pVertexBuffer->Unlock();


Et je l'affiche comme cela :

g_pd3dDevice->SetTexture( 0, g_pTexture );
    g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(Vertex) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );


Mais si je veux en créer et en afficher 300 ?!!
Il doit sûrement y avoir un moyen mais comme je début avec directX.

3 réponses

Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

J'ai pas été trés clair...

Si je crée 300 objest, je vais quand même pas écrire ça 300 fois en changeant g_ptexture et g_pVertexBuffer ...
g_pd3dDevice->SetTexture( 0, g_pTexture );
g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(Vertex) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Salut,

J'ai l'impression que tu veux afficher des sprites à l'écran et que tu passes par des vertex et index buffer...

Si tu veux utiliser des sprites, sache qu'il existe une classe dans DirectX extremement utile pour les sprites: ID3DXSprite
Elle permet de faire des rotations, translations, zoom, d'utiliser TRES facilement la transparence, les couleurs clefs....

Ex:
LPD3DXSPRITE m_pTileSprite;
D3DXCreateSprite( lpDirect3DDevice9, &m_pTileSprite );
D3DXVECTOR2 echelle(1.0f,1.0f);
D3DXVECTOR2 centreDeRotation(0.0f,0.0f);
D3DXVECTOR2 translation(0.0f,0.0f);
D3DCOLOR modColor;

D3DXCreateTextureFromFile( lpDirect3DDevice9,
"image.bmp",
&m_pTileTexture);

m_pTileSprite->Draw(m_pTileTexture, // texture
&scrRect, // zone de la texture a afficher
&echelle, // 1/zoom en gros
¢reDeRotation, 0.0f,
&translation, // position globale du coin
modColor ); // alpha + couleur

m_pTileSprite->Release();

Super simple, nan?

Sinon, si tu veux vraiment utiliser des vertex, tu peux soit creer un tableau de vertex et les remplir en boucle (dans ce cas pas besoin de creer plusieurs index buffer).
Soit tu n'en cree qu'un que tu transformes et affiches 300 fois, un par un en utilisant "lpDirect3DDevice9->SetTransform( D3DTS_WORLD, maticeTransEnv3D );"

avec maticeTransEnv3D la matrice de transformation des vertices (une par objet).
Juste avant l'affichage sur le backbuffer, la carte vidéo va modifier la position des vertices en les multipliant par la matrice.
En gros tu affichera toujours le meme objet mais a des positions differentes.

J'ai forcement pas été clair. N'hesite pas a me demander des details.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Salut,

J'ai l'impression que tu veux afficher des sprites à l'écran et que tu passes par des vertex et index buffer...

Si tu veux utiliser des sprites, sache qu'il existe une classe dans DirectX extremement utile pour les sprites: ID3DXSprite
Elle permet de faire des rotations, translations, zoom, d'utiliser TRES facilement la transparence, les couleurs clefs....

Ex:
LPD3DXSPRITE m_pTileSprite;
D3DXCreateSprite( lpDirect3DDevice9, &m_pTileSprite );
D3DXVECTOR2 echelle(1.0f,1.0f);
D3DXVECTOR2 centreDeRotation(0.0f,0.0f);
D3DXVECTOR2 translation(0.0f,0.0f);
D3DCOLOR modColor;

D3DXCreateTextureFromFile( lpDirect3DDevice9,
"image.bmp",
&m_pTileTexture);

m_pTileSprite->Draw(m_pTileTexture, // texture
&scrRect, // zone de la texture a afficher
&echelle, // 1/zoom en gros
¢reDeRotation, 0.0f,
&translation, // position globale du coin
modColor ); // alpha + couleur

m_pTileSprite->Release();

Super simple, nan?

Sinon, si tu veux vraiment utiliser des vertex, tu peux soit creer un tableau de vertex et les remplir en boucle (dans ce cas pas besoin de creer plusieurs index buffer).
Soit tu n'en cree qu'un que tu transformes et affiches 300 fois, un par un en utilisant "lpDirect3DDevice9->SetTransform( D3DTS_WORLD, maticeTransEnv3D );"

avec maticeTransEnv3D la matrice de transformation des vertices (une par objet).
Juste avant l'affichage sur le backbuffer, la carte vidéo va modifier la position des vertices en les multipliant par la matrice.
En gros tu affichera toujours le meme objet mais a des positions differentes.

J'ai forcement pas été clair. N'hesite pas a me demander des details.