|

楼主 |
发表于 2010-8-5 23:42:00
|
显示全部楼层
Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?
下面的这段代码导出的是个白板:
- if( !g_strPendingSaveShadowMap.empty() )
- {
- IDirect3DSurface9* pCurrentRenderTarget = NULL;
- IDirect3DSurface9* pBuf = NULL;
- D3DSURFACE_DESC Desc;
- pd3dDevice->GetRenderTarget( 0, &pCurrentRenderTarget );
- if( pCurrentRenderTarget != NULL )
- {
- pCurrentRenderTarget->GetDesc( &Desc );
- pd3dDevice->CreateOffscreenPlainSurface( Desc.Width, Desc.Height, Desc.Format, D3DPOOL_SYSTEMMEM, &pBuf, NULL );
- if( pBuf != NULL )
- {
- pd3dDevice->GetRenderTargetData( pCurrentRenderTarget, pBuf );
- D3DLOCKED_RECT LockRect;
- if( D3D_OK == pBuf->LockRect( &LockRect, NULL, D3DLOCK_READONLY ) && LockRect.pBits != NULL )
- {
- IDirect3DSurface9* pNewBuf = NULL;
- pd3dDevice->CreateOffscreenPlainSurface( Desc.Width, Desc.Height, D3DFMT_A32B32G32R32F, D3DPOOL_SYSTEMMEM, &pNewBuf, NULL );
- if( pNewBuf )
- {
- D3DLOCKED_RECT NewLockRect;
- if( D3D_OK == pNewBuf->LockRect( &NewLockRect, NULL,D3DLOCK_DISCARD ) )
- {
- struct Data
- {
- float data[4];
- };
-
- Data* pData = (Data*)NewLockRect.pBits;
-
- const int Size = Desc.Width*Desc.Height;
- for( int i=0; i<Size; ++i )
- {
- pData[i].data[0] = (( const float* )LockRect.pBits)[i];
- pData[i].data[1] = (( const float* )LockRect.pBits)[i];
- pData[i].data[2] = (( const float* )LockRect.pBits)[i];
- pData[i].data[3] = (( const float* )LockRect.pBits)[i];
- }
- pNewBuf->UnlockRect();
- if( D3D_OK != D3DXSaveSurfaceToFile( g_strPendingSaveShadowMap.c_str(), D3DXIFF_BMP, pNewBuf, NULL, NULL ) )
- {
- MessageBox( NULL, _T("Error"), _T("Error"), 0 );
- }
- }
- SAFE_RELEASE( pNewBuf );
- }
- pBuf->UnlockRect();
- }
- else
- {
- MessageBox( NULL, _T("Error"), _T("Error"), 0 );
- }
- SAFE_RELEASE(pBuf);
- }
- SAFE_RELEASE( pCurrentRenderTarget );
- }
- g_strPendingSaveShadowMap.clear();
- }
复制代码 |
|