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

  • IBM Worklight is a mobile application development platform that lets you extend your business to mobile devices. It is designed to provide an open, comprehensive platform to build, run and manage HTML5, hybrid and native mobile apps.

  • Protecting business operations means shifting the priorities around availability from disaster recovery to business continuity. Enterprises are shifting their focus from recovery from a disaster to preventing the disaster in the first place. With this change in mindset, disaster recovery is no longer the first line of defense; the organizations with a smarter business continuity practice are less impacted when disasters strike. This SmartSelect will provide insight to help guide your enterprise toward better …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds