Generating Debug Bitmaps for DirectX

Introduction

Debugging a DirectX application is not the easiest thing to do. Most times, you're looking for reasons why your image did not display on the screen or why it displayed incorrectly. The following snippet of code should help in your debugging efforts. Cut and paste it to your DirectX program and call it before calling the DirectX Present() method. It will allow you to capture an image of a screen buffer into a bitmap file. Each image is named in a sequential fashion. This will provide a snapshot of exactly what is being presented to the screen.

Notes:
  1. This code assumes you have one back buffer defined.
  2. This code assumes your DirectX device is defined as 'windowed'.
  3. m_rect is the CRect for the associated device window.
//
// This method is used for debugging. It will dump the current
// back buffer surface to a bitmap. This provides a snapshot of
// what is currently ready for presentation.
//
void debug_dump_buffer()
{
   IDirect3DSurface9* pRenderTarget=NULL;
   IDirect3DSurface9* pDestTarget=NULL;
   D3DDISPLAYMODE d3ddisplaymode;

   // sanity checks.
   if (pDirect3DDevice == NULL)
      return;

   // get the render target surface.
   HRESULT hr = pDirect3DDevice->GetRenderTarget(0, &pRenderTarget);
   // get the current adapter display mode.
   hr = pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
                                         &d3ddisplaymode);
   // create a destination surface.
   hr = pDirect3DDevice->CreateOffscreenPlainSurface(m_rect.Width(),
                         m_rect.Height(),
                         d3ddisplaymode.Format,
                         D3DPOOL_SYSTEMMEM,
                         &pDestTarget,
                         NULL);
   //copy the render target to the destination surface.
   hr = pDirect3DDevice->GetRenderTargetData(pRenderTarget,
                                             pDestTarget);
   //save its contents to a bitmap file.
   file.Format("DX Buffer %d.bmp", ndebug++);
   hr = D3DXSaveSurfaceToFile(file,
                              D3DXIFF_BMP,
                              pDestTarget,
                              NULL,
                              NULL);

   // clean up.
   pRenderTarget->Release();
   pDestTarget->Release();
}


Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Who can you trust? Learn from the IBM X-Force team in this new quarterly report how the Internet of Things and IP reputation tracking are transforming the security landscape.

  • As virtualization becomes the norm throughout organizations of nearly all sizes, and as more organizations look to private cloud solutions, IT decision makers are increasingly in need of ways to keep storage costs and complexity under control in the face of often-runaway virtual machine (VM) sprawl. Application-aware storage is designed to help achieve these important goals. Read this white paper to learn how application-aware storage allows you to gain VM-level visibility into application performance and …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date