Cuando grabo el backbuffer, me aparece TODO del mismo color. Y no entiendo porqué, puesto que creo que lo hago correctamente.
Este es mi código:
LPDIRECT3DSURFACE8 pBackBuffer;
m_pd3dDevice->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
HRESULT hr=D3DXSaveSurfaceToFile(nombre,
D3DXIFF_BMP, // Formato
pBackBuffer,
NULL, // Paleta
NULL // Rectángulo del area a grabar
);
if(hr!=D3D_OK) {
EstablecerUltimoError(hr);
Merlin.Debug(_T("CXVideo::GrabarPantalla"),*UltimoError());
}
pBackBuffer->Release();
¿Alguien puede ayudarme?
Hi Drácula.
Ese código es correcto. Por si acaso lo he probado, pero efectivamente funciona.
No se que puede fallar. :triste:
Saludos.
Y ese color no sera el color con el que borras?
Prueba a pedir el FrontBuffer en vez del BackBuffer. Pasa de las D3DX y usa :
LPDIRECT3DSURFACE8 lpSurface = NULL;
m_pD3DDevice->CreateImageSurface(dwWidth, dwHeight, D3DFMT_A8R8G8B8, &lpSurface);
m_pD3DDevice->GetFrontBuffer(lpSurface);
y luego lo metes todo en una estructura BITMAPFILEHEADER y BITMAPINFOHEADER. Tambien tendras que pasar del formato de la surface a un DIB y listo! :ojo:
Drácula el problemilla es que no puedes leer directamente el backbuffer, tienes que crear una superficie en memoria de sistema con el mismo tamaño y formato y hacer un CopyRects(). El de memoria de sistema si le puedes hacer Lock() o grabar en disco o lo que quieras.
saludos
Gracias, ya lo he probado y me funciona. Tenía que coger el forntbuffer y crear una área, como me habeis dicho.
Y se puede saber por qué a mi me funciona?
Pues seguramente, Nelo, porque NO borras el backbuffer en cada frame... digo yo, vamos...
SI lo borro.
Por si sirve de algo, échale un vistazo a la page de
Robert DunlopUn saludo
Buenas, capturando el FrontBuffer no habia el problema de que te pillaba tambien el escritorio del windows cuando estas en modo ventana? no estoy seguro pero creo que era por eso por lo que lo hice capturando el BackBuffer, Drácula tu lo habrás probado en modo ventana... funciona bien? porque si funciona bien paso del BackBuffer ya mismo.
Hi mallrat
Probé a coger el FrontBuffer, y en modo ventana me cogía toda la pantalla.
Yo seguiré con BackBuffer si no encuentro algo mejor. :-?
Saludos.
Sí que se graba toda la pantalla al usar el FrontBuffer en modo ventana. Pero yo lo recorto, pasando a la función de grabar sólo el rectángulo de la ventana. Si quieres, puedo darte el código...