Lire le backbuffer ? Capture d'écran ? (DirectX 9)

cs_supergrey Messages postés 475 Date d'inscription vendredi 27 juin 2003 Statut Membre Dernière intervention 20 septembre 2010 - 14 août 2005 à 11:46
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 14 août 2005 à 13:05
Salut, j'aurai besoin de lire chaque octet du backbuffer
(de ce qui va etre afficher a l'ecran) dans un programme directx 9.
Comment faire?
Merci

5 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 août 2005 à 12:05
Tiens donc, un DirectX !





Ajoute ce flag dans la structure D3DPRESENT_PARAMETERS (necessaire pour
la creation du device lpDirect3DDevice9) :
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER



Ensuite, recupere l'adresse de la surface du back buffer:

LPDIRECT3DSURFACE9 m_pBackBufferSurface;

lpDirect3DDevice9->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&m_pBackBufferSurface);



Puis tu pourras locker la surface:

D3DLOCKED_RECT pLockedRect;

D3DCOLOR *pPix;

pBackBufferSurface->LockRect(

&pLockedRect,

NULL,

D3DLOCK_NO_DIRTY_UPDATE );

pPix =
(D3DCOLOR*)pLockedRect.pBits;
// acces au données via pPix (les fameux octets recherchés)



// traitement puis

pBackBufferSurface->UnlockRect();



Voila, ca doit marcher.
0
cs_supergrey Messages postés 475 Date d'inscription vendredi 27 juin 2003 Statut Membre Dernière intervention 20 septembre 2010
14 août 2005 à 12:16
Merci beaucoup, je vais voir si ca fonctionne.
0
cs_supergrey Messages postés 475 Date d'inscription vendredi 27 juin 2003 Statut Membre Dernière intervention 20 septembre 2010
14 août 2005 à 12:45
Eu... ca a l'air de fonctionner, juste une question stupide, comment on
récupère les 3 valeur R G et B dans le D3DCOLOR je crois que c'est un
truc du genre int r=(color<<2) enfin je sais plus trop...
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 août 2005 à 12:51
Ca depend du format du back buffer.

Generalement:

ARGB, un octet par channel

color = 0x11223344

0x11 pour alpha

0x22 pour le channel rouge

0x33 vert

0x44 bleu



donc:

alpha = (color >> 8*3)

rouge = (color >> 8*2) & 0xFF

vert = (color >> 8*1) & 0xFF

bleu = (color >> 8*0) & 0xFF
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 août 2005 à 13:05
Sinon, ne te prend pas la tete avec les channels:



D3DXSaveSurfaceToFile( "screenshot.bmp",

D3DXIFF_BMP,

pBackBufferSurface,

NULL, // Palette

NULL); // Rect
0
Rejoignez-nous