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

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

  • A modern mobile IT strategy is no longer an option, it is an absolute business necessity. Today's most productive employees are not tied to a desk, an office, or a location. They are mobile. And your company's IT strategy has to be ready to support them with easy, reliable, 24/7 access to the business information they need, from anywhere in the world, across a broad range of communication devices. Here's how some of the nation's most progressive corporations are meeting the many needs of their mobile workers …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds