2010-11-07 11 views
9

Quiero renderizar un video cuadro por cuadro usando DirectX 10. Los marcos serían procesados ​​posteriormente por alguna otra herramienta como mencoder o ffmpeg.¿Cómo guardar backbuffer en un archivo en DirectX 10?

No tuve problemas para hacerlo en DX9 usando D3DXSaveSurfaceToFile.

Ahora, en DX10 encontré D3DX10SaveTextureToFile, pero no tuve suerte al usarlo para guardar mi backbuffer.

uso el siguiente código:

ID3D10Resource *backbufferRes; 
_defaultRenderTargetView->GetResource(&backbufferRes); 

D3D10_TEXTURE2D_DESC texDesc; 
texDesc.ArraySize = 1; 
texDesc.BindFlags = 0; 
texDesc.CPUAccessFlags = D3D10_CPU_ACCESS_READ; 
texDesc.Format = backbufferSurfDesc.Format; 
texDesc.Height = backbufferSurfDesc.Height; 
texDesc.Width = backbufferSurfDesc.Width; 
texDesc.MipLevels = 1; 
texDesc.MiscFlags = 0; 
texDesc.SampleDesc = backbufferSurfDesc.SampleDesc; 
texDesc.Usage = D3D10_USAGE_STAGING; 

ID3D10Texture2D *texture; 
HRESULT hr; 
V(_device->CreateTexture2D(&texDesc, 0, &texture)); 
_device->CopyResource(texture, backbufferRes); 

V(D3DX10SaveTextureToFile(texture, D3DX10_IFF_DDS, filename)); 
texture->Release(); 

Esto crea una imagen .dds que no puede ser abierto por cualquier tipo de DDS ver/editor que conozco.

¿Qué pasa con mi código?

Respuesta

12

Todo el mérito recae en el sepul de gamedev.net.

Ahora, los problemas:

  • texDesc.CPUAccessFlags debe ser 0
  • texDesc.Format debería haber DXGI_FORMAT_R8G8B8A8_UNORM
  • texDesc.SampleDesc.Count debe ser de 1
  • texDesc.SampleDesc.Quality debe ser 0
  • texDesc.Usage debe ser D3D10_USAGE_DEFAULT

De esta manera, D3DX10SaveTextureToFile se guardará en BMP incluso en PNG.

El código completo es:

HRESULT hr; 
ID3D10Resource *backbufferRes; 
_defaultRenderTargetView->GetResource(&backbufferRes); 

D3D10_TEXTURE2D_DESC texDesc; 
texDesc.ArraySize = 1; 
texDesc.BindFlags = 0; 
texDesc.CPUAccessFlags = 0; 
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
texDesc.Width = 640; // must be same as backbuffer 
texDesc.Height = 480; // must be same as backbuffer 
texDesc.MipLevels = 1; 
texDesc.MiscFlags = 0; 
texDesc.SampleDesc.Count = 1; 
texDesc.SampleDesc.Quality = 0; 
texDesc.Usage = D3D10_USAGE_DEFAULT; 

ID3D10Texture2D *texture; 
V(_device->CreateTexture2D(&texDesc, 0, &texture)); 
_device->CopyResource(texture, backbufferRes); 

V(D3DX10SaveTextureToFile(texture, D3DX10_IFF_PNG, L"test.png")); 
texture->Release(); 
backbufferRes->Release(); 
Cuestiones relacionadas