SDKMisc的一个小错误

时间:2022-03-29 10:00:55

使用DX2007SDK的SDKMisc.h里面的函数
HRESULT DXUTSnapD3D9Screenshot( LPCTSTR szFileName );
这个函数存在一些小问题。
函数原型是这样的
//--------------------------------------------------------------------------------------
HRESULT DXUTSnapD3D9Screenshot( LPCTSTR szFileName )
{
    HRESULT hr = S_OK;
    IDirect3DDevice9* pDev = DXUTGetD3D9Device();
    if( !pDev )
        return E_FAIL;

    IDirect3DSurface9* pBackBuffer = NULL;
    V_RETURN( pDev->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ) );

    return D3DXSaveSurfaceToFile( szFileName, D3DXIFF_BMP, pBackBuffer, NULL, NULL );
}
获得设备后台缓冲区的数据,将数据在写入到文件中。
实际使用这个函数会发现,调用该函数之后,DXUTReset3DEnvironment9()的返回值是DXUTERR_RESETTINGDEVICE,该错误的存在将导致程序重启D3D设备。开始还以为是自己的程序有错误,仔细跟踪后发现,是因为这个函数没有释放数据造成的。修改这个函数为如下格式:
//--------------------------------------------------------------------------------------
HRESULT DXUTSnapD3D9Screenshot( LPCTSTR szFileName )
{
    HRESULT hr = S_OK;
    IDirect3DDevice9* pDev = DXUTGetD3D9Device();
    if( !pDev )
        return E_FAIL;

    IDirect3DSurface9* pBackBuffer = NULL;
    V_RETURN( pDev->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ) );

    hr =  D3DXSaveSurfaceToFile( szFileName, D3DXIFF_BMP, pBackBuffer, NULL, NULL );

 SAFE_RELEASE(pBackBuffer);
 return hr;
}
以后就不会出现DXUTERR_RESETTINGDEVICE错误了。
另外,使用D3DXIFF_BMP保存的Bmp图像非常大,修改为D3DXIFF_JPG保存为Jpeg图像就小了很多,差不多能小10倍吧。