CMZTECH.NET
  • Blog
  • Graphics
  • Virtual Reality
  • 3D Printing
  • Fun Stuff
  • Contact
Back to Adventures in DX11

How to take a screenshot from a DX11 application with MSAA enabled

Picture
Being able to create screenshots sequentially from an application is useful if you need to render video or even just for debugging.
Saving a frame buffer as a file can be quite a challenge.  Often a frame buffer is not just linear memory, it may be swizzled for improved memory access patterns or in the case of multi-sampling it may actually be larger than you expect.
DX11 provides functions for easily creating screen shots.  Here is my code for grabbing an MSAA frame buffer, resolving it into a linear buffer and then saving as a file.


Source Code

void screenShot(char* filename)
{
HRESULT hr;


ID3D11Texture2D *pBackBuffer = NULL;
hr = g_SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer ); 

D3D11_TEXTURE2D_DESC resolveDesc;
pBackBuffer->GetDesc(&resolveDesc);

resolveDesc.Usage = D3D11_USAGE_DEFAULT;
resolveDesc.BindFlags = 0;
resolveDesc.CPUAccessFlags = 0; 
resolveDesc.SampleDesc.Count=1;    //resolved buffer is not multisampled
resolveDesc.SampleDesc.Quality=0;

ID3D11Texture2D *pResolveBuffer = NULL;
hr = g_d3d11Device->CreateTexture2D(&resolveDesc, NULL, &pResolveBuffer);
g_d3d11DevCon->ResolveSubresource(pResolveBuffer, D3D11CalcSubresource( 0, 0, 1 ), pBackBuffer, D3D11CalcSubresource( 0, 0, 1 ),  resolveDesc.Format );

hr=D3DX11SaveTextureToFileA(g_d3d11DevCon,pResolveBuffer,D3DX11_IFF_PNG, filename);

pBackBuffer->Release();
pResolveBuffer->Release();

}

Back to Adventures in DX11