Recombiner plusieurs surfaces ensembles : direct X 9

jemac Messages postés 4 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 15 mars 2006 - 15 févr. 2006 à 22:39
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 16 févr. 2006 à 16:07
Voila j'ai effectué mes rendus pour remplir une CubeMap (LPDIRECT3DCUBETEXTURE9 m_pCubeMap) , elle a l'air d'être correctement remplit mais voila mon problème :
J'ai besoin de recupérer les 6 faces du cube puis d'acceder aux couleurs pixel par pixel, et enfin de recombiner ces textures dans une seule que je veux afficher sur tout mon écran, dans l'optique d'un projecteur panoramique.
j'ai besoin de les récuperer dans des byte et j'ai mis la CubeMap en D3DFMT_R8G8B8, donc je pense que les surfaces correspondant aux faces seront dans le même mode.

// allocation des tableaux sur lesquels je veux travailler
byte * imgout= new byte[1024*768*3];
byte **tabimg;
tabimg= new byte*[6];

D3DLOCKED_RECT pLockedRect[6];


for(int i=0;i<6;i++)
{
// LE PROBLEME EST ICI
hr=pCubeMapFace[i]->LockRect(&pLockedRect[i],NULL,D3DLOCK_READONLY);
if(hr==D3D_OK)
// la recopie ne se fait pas car on entre jamias dans le if, le LockRect ne marche pas
tabimg[i]=(byte*)pLockedRect[i].pBits;
}
}

// ensuite on fait notre traitement sur nos tableaux et on récupère un resultat dans imgout.

// on unlock les 6 surfaces de rendu
for(int i=0;i<6;i++)
{
pCubeMapFace[i]->UnlockRect();
}


// on lock la surface finale
D3DLOCKED_RECT pLockedRectFinal;
hr=pMapFinalRendu->LockRect(&pLockedRectFinal,NULL,D3DLOCK_READONLY);
if(hr==D3D_OK)
pLockedRectFinal.pBits=imgout;


// on la unlock
pMapFinalRendu->UnlockRect();
// on affiche notre surface finale a l'écran, je ne sais pas si cette fonction marche vu que le programme n'est jamias aller jusque la ;-) , de toutes façon le problème se situe avant.
m_pd3dDevice->SetRenderTarget(0,pMapFinalRendu);

voila, je pense qu'en modifiant les tableaux on modifie la valeur des pixels de la surface, et qu'elle est remise à jour avec le UnLockRect(), je me trompe ou pas?
A voir également:

4 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 févr. 2006 à 01:44
Extraits d'un code:

for (DWORD k=0; k<dwNumCubeTextures; k++)
{
//LPDIRECT3DTEXTURE9 pTexture;

// Create cube texture
DWORD dwWidth = 0;
memcpy(&dwWidth, (BYTE*)pCpy, sizeof(WORD));
pCpy += sizeof(WORD);
LPDIRECT3DCUBETEXTURE9* ppCubeTexture = (LPDIRECT3DCUBETEXTURE9*)(m_ppTextures + m_dwNumTextures + k);
lpDirect3DDevice9->CreateCubeTexture(dwWidth,
0,
D3DUSAGE_DYNAMIC,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
ppCubeTexture,
NULL);


for (DWORD i=0; i<6; i++) // The 6 cube faces
{
if (!*pCpy) { pCpy++; continue; }
DWORD dwSize = g_pScene->GetStringLength(pCpy)+1;

LPDIRECT3DSURFACE9 pCubeSurface;
(*ppCubeTexture)->GetCubeMapSurface( D3DCUBEMAP_FACES(i), 0, &pCubeSurface );
if (pCubeSurface == NULL) return FALSE;

D3DCOLOR d3dKeyColor = 0xFFFF00FF;
D3DXIMAGE_INFO srcInfo;
D3DXLoadSurfaceFromFile(pCubeSurface,
NULL, // palette
NULL, // rect
pCpy, //"right.jpg",
NULL, // rect
D3DX_FILTER_NONE,
d3dKeyColor,
&srcInfo);

pCpy += dwSize;
}
}
0
jemac Messages postés 4 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 15 mars 2006
16 févr. 2006 à 13:54
En fait ce que tu propose c'est d'enregistrer les 6 textures dans des fichiers puis les réouvrir plus tard ? Je ne peut pas me permettre de faire cela car le temps de rendu est bien trop lent pour faire du temps réel.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 févr. 2006 à 16:06
Nan en fait, je créé une cube texture, puis je remplis les 6 faces avec 6 textures dont les noms sont stockés dans un fichier.
Il n'y a aucune opération en trop.

Le but de cet extrait est de montrer les paramètres transmis aux fonctions directX.


Mince alors, j'avais mal lu ta question...

Tu récupères un pointeur vers une des faces de la cube texture ainsi:
LPDIRECT3DSURFACE9 pCubeSurface;
pCubeTexture->GetCubeMapSurface( D3DCUBEMAP_FACES(i), 0, &pCubeSurface );

Pour accéder aux pixels il te faut effectivement locker la surface mais attention, toutes les surfaces ne sont pas lockables.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/d3dusage.asp

Jette un oeil sur ces fonctions si tu veux faire des copies de pixels par bloc.
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/reference/d3d/interfaces/IDirect3DDevice9/UpdateSurface.asp
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/reference/d3d/interfaces/IDirect3DDevice9/UpdateSurface.asp
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 févr. 2006 à 16:07
0
Rejoignez-nous