2010-11-07 8 views
9

Je veux rendre une vidéo image par image en utilisant DirectX 10. Les images seront traitées plus tard par un autre outil comme mencoder ou ffmpeg.Comment sauvegarder un backbuffer dans un fichier dans DirectX 10?

Je n'ai eu aucun problème à le faire dans DX9 en utilisant D3DXSaveSurfaceToFile.

Maintenant, dans DX10 j'ai trouvé D3DX10SaveTextureToFile, mais je n'ai pas eu de chance de l'utiliser pour sauvegarder mon backbuffer.

J'utilise le code suivant:

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(); 

Cela crée une image .dds qui ne peut être ouvert par toute sorte de vue/éditeur DDS Je connais.

Quel est le problème avec mon code?

Répondre

12

Tout le crédit va à sepul de gamedev.net.

Maintenant, les problèmes:

  • texDesc.CPUAccessFlags doit être 0
  • texDesc.Format devrait être DXGI_FORMAT_R8G8B8A8_UNORM
  • texDesc.SampleDesc.Count devrait être 1
  • texDesc.SampleDesc.Quality devrait être 0
  • texDesc.Usage devrait être D3D10_USAGE_DEFAULT

De cette façon, D3DX10SaveTextureToFile enregistrera au BMP même au PNG.

Le code complet est:

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(); 
Questions connexes