FAQ DirectX
FAQ DirectXConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 63, dernière mise à jour : 14 juin 2021
Afin de capturer la scène courante avec DirectX, il faut récupérer le contenu du front buffer ou du back buffer, puis enregistrer celui-ci dans un fichier à l'aide des fonctions de D3DX.
Voici une fonction effectuant cette tâche :
void
ScreenShot(const
std::
string&
Filename)
{
// Surface de destination
LPDIRECT3DSURFACE9 Surface =
NULL
;
// Si on est en mode fenêtré alors on récupère le backbuffer, sinon on prend le frontbuffer (qui permet d'avoir l'anti-aliasing)
if
(Windowed)
{
// Récupération du backbuffer
Device->
GetBackBuffer(0
, 0
, D3DBACKBUFFER_TYPE_MONO, &
Surface);
// Sauvegarde de la surface dans le fichier
D3DXSaveSurfaceToFile(Filename.c_str(), D3DXIFF_BMP, Surface, NULL
, NULL
);
}
else
{
// Récupération des dimensions du bureau (la surface doit impérativement avoir ces dimensions)
int
Width =
GetSystemMetrics(SM_CXSCREEN);
int
Height =
GetSystemMetrics(SM_CYSCREEN);
// Création de la surface de destination (doit impérativement être en D3DFMT_A8R8G8B8)
Device->
CreateOffscreenPlainSurface(Width, Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &
Surface, NULL
);
// Récupération des données du front buffer
Device->
GetFrontBufferData(NULL
, Surface);
// Sauvegarde de l'image dans un fichier, au format BMP
D3DXSaveSurfaceToFile(Filename.c_str(), D3DXIFF_BMP, Surface, NULL
, NULL
);
}
// Destruction de la surface
SAFE_RELEASE(Surface);
}
Ce code est séparé en deux parties : en effet si l'on se trouve en mode plein écran, seule la récupération du front buffer permet d'obtenir l'image finale en cas d'utilisation de l'anti-aliasing. Sinon, le back buffer fait parfaitement l'affaire.