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

  • Ever-increasing workloads and the challenge of containing costs leave companies conflicted by the need for increased processing capacity while limiting physical expansion. Migration to HP's new generation of increased-density rack-and-blade servers can address growing demands for compute capacity while reducing costly sprawl. Sponsored by: HP and Intel® Xeon® processors Intel, the Intel logo, and Xeon Inside are trademarks of Intel Corporation in the U.S. and/or other countries. HP is the sponsor …

  • Download the Information Governance Survey Benchmark Report to gain insights that can help you further establish business value in your Records and Information Management (RIM) program and across your entire organization. Discover how your peers in the industry are dealing with this evolving information lifecycle management environment and uncover key insights such as: 87% of organizations surveyed have a RIM program in place 8% measure compliance 64% cannot get employees to "let go" of information for …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds