Recombiner plusieurs surfaces ensembles : direct X 9
jemac
Messages postés4Date d'inscriptiondimanche 19 décembre 2004StatutMembreDernière intervention15 mars 2006
-
15 févr. 2006 à 22:39
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDerniè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:
Recombiner plusieurs surfaces ensembles : direct X 9
jemac
Messages postés4Date d'inscriptiondimanche 19 décembre 2004StatutMembreDernière intervention15 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.
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 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.