2010-11-07 17 views
9

Tôi muốn hiển thị từng khung hình video bằng DirectX 10. Các khung hình sẽ được xử lý sau bởi một số công cụ khác như mencoder hoặc ffmpeg.Làm thế nào để lưu backbuffer để tập tin trong DirectX 10?

Tôi không gặp vấn đề gì trong DX9 khi sử dụng D3DXSaveSurfaceToFile.

Bây giờ, trong DX10 tôi đã tìm thấy D3DX10SaveTextureToFile, nhưng không có may mắn khi sử dụng nó để lưu backbuffer của tôi.

tôi sử dụng đoạn mã sau:

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

Điều này tạo ra một hình ảnh DDS mà không thể được mở bằng bất kỳ loại DDS xem/biên tập viên tôi biết.

Mã của tôi có vấn đề gì?

Trả lời

12

Tất cả tín dụng sẽ được chuyển tới gamedev.net.

Bây giờ, các vấn đề:

  • texDesc.CPUAccessFlags phải là 0
  • texDesc.Format nên DXGI_FORMAT_R8G8B8A8_UNORM
  • texDesc.SampleDesc.Count nên 1
  • texDesc.SampleDesc.Quality phải là 0
  • texDesc.Usage nên D3D10_USAGE_DEFAULT

Bằng cách này, D3DX10SaveTextureToFile sẽ lưu thành BMP thậm chí là PNG.

Mã hoàn chỉnh là:

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(); 
Các vấn đề liên quan