游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6081|回复: 6

如何导出D3DFMT_R32F格式的ShadowMap到文件?

[复制链接]

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2010-8-5 23:15:00 | 显示全部楼层 |阅读模式
[em3] [em3]
我使用下面的代码成功的导出了渲染完成之后的截图:

  1. IDirect3DSurface9*  pCurrentRenderTarget = NULL;
  2.                 IDirect3DSurface9*  pBuf = NULL;
  3.                 D3DSURFACE_DESC            Desc;  

  4.                 pd3dDevice->GetRenderTarget( 0, &pCurrentRenderTarget );

  5.                 if( pCurrentRenderTarget != NULL )
  6.                 {
  7.                         pCurrentRenderTarget->GetDesc( &Desc );

  8.                         pd3dDevice->CreateOffscreenPlainSurface( Desc.Width, Desc.Height, Desc.Format, D3DPOOL_SYSTEMMEM, &pBuf, NULL );

  9.                         if( pBuf != NULL )
  10.                         {
  11.                                 pd3dDevice->GetRenderTargetData( pCurrentRenderTarget, pBuf );

  12.                                 if( D3D_OK != D3DXSaveSurfaceToFile( g_strPendingSaveShadowMap.c_str(), D3DXIFF_BMP, pBuf, NULL, NULL ) )
  13.                                 {
  14.                                         MessageBox( NULL, _T("Error"), _T("Error"), 0 );
  15.                                 }                               

  16.                                 SAFE_RELEASE(pBuf);
  17.                         }

  18.                         SAFE_RELEASE( pCurrentRenderTarget );
  19.                 }
复制代码


但是当只渲染完ShadowMap的时候用这段代码导出D3DFMT_R32F格式的表面到文件的时候,发现导出的结果貌似不对,请问如何才能导出这样的32位浮点数格式的纹理到外部像一张灰度图一样。

我使用LockRect得到内存缓冲区,使用浮点数值乘以8然后直接输出到文件貌似也不可以,是否图像开头部分还需要什么格式什么的呢?

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2010-8-5 23:42:00 | 显示全部楼层

Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?

下面的这段代码导出的是个白板:

  1.         if( !g_strPendingSaveShadowMap.empty() )
  2.         {
  3.                 IDirect3DSurface9*  pCurrentRenderTarget = NULL;
  4.                 IDirect3DSurface9*  pBuf = NULL;
  5.                 D3DSURFACE_DESC            Desc;  

  6.                 pd3dDevice->GetRenderTarget( 0, &pCurrentRenderTarget );

  7.                 if( pCurrentRenderTarget != NULL )
  8.                 {
  9.                         pCurrentRenderTarget->GetDesc( &Desc );

  10.                         pd3dDevice->CreateOffscreenPlainSurface( Desc.Width, Desc.Height, Desc.Format, D3DPOOL_SYSTEMMEM, &pBuf, NULL );

  11.                         if( pBuf != NULL )
  12.                         {
  13.                                 pd3dDevice->GetRenderTargetData( pCurrentRenderTarget, pBuf );

  14.                                 D3DLOCKED_RECT LockRect;
  15.                                 if( D3D_OK == pBuf->LockRect( &LockRect, NULL, D3DLOCK_READONLY ) && LockRect.pBits != NULL )
  16.                                 {
  17.                                         IDirect3DSurface9*  pNewBuf = NULL;

  18.                                         pd3dDevice->CreateOffscreenPlainSurface( Desc.Width, Desc.Height, D3DFMT_A32B32G32R32F, D3DPOOL_SYSTEMMEM, &pNewBuf, NULL );

  19.                                         if( pNewBuf )
  20.                                         {
  21.                                                 D3DLOCKED_RECT NewLockRect;

  22.                                                 if( D3D_OK == pNewBuf->LockRect( &NewLockRect, NULL,D3DLOCK_DISCARD ) )
  23.                                                 {
  24.                                                         struct Data
  25.                                                         {
  26.                                                                 float data[4];
  27.                                                         };
  28.                                                        
  29.                                                         Data* pData = (Data*)NewLockRect.pBits;
  30.                                                        
  31.                                                         const int Size = Desc.Width*Desc.Height;
  32.                                                         for( int i=0; i<Size; ++i )
  33.                                                         {
  34.                                                                 pData[i].data[0] = (( const float* )LockRect.pBits)[i];
  35.                                                                 pData[i].data[1] = (( const float* )LockRect.pBits)[i];
  36.                                                                 pData[i].data[2] = (( const float* )LockRect.pBits)[i];
  37.                                                                 pData[i].data[3] = (( const float* )LockRect.pBits)[i];
  38.                                                         }

  39.                                                         pNewBuf->UnlockRect();

  40.                                                         if( D3D_OK != D3DXSaveSurfaceToFile( g_strPendingSaveShadowMap.c_str(), D3DXIFF_BMP, pNewBuf, NULL, NULL ) )
  41.                                                         {
  42.                                                                 MessageBox( NULL, _T("Error"), _T("Error"), 0 );
  43.                                                         }
  44.                                                 }

  45.                                                 SAFE_RELEASE( pNewBuf );
  46.                                         }

  47.                                         pBuf->UnlockRect();
  48.                                 }
  49.                                 else
  50.                                 {
  51.                                         MessageBox( NULL, _T("Error"), _T("Error"), 0 );
  52.                                 }

  53.                                 SAFE_RELEASE(pBuf);
  54.                         }

  55.                         SAFE_RELEASE( pCurrentRenderTarget );
  56.                 }

  57.                 g_strPendingSaveShadowMap.clear();
  58.         }
复制代码

1

主题

36

帖子

1442

积分

金牌会员

Rank: 6Rank: 6

积分
1442
发表于 2010-8-6 00:30:00 | 显示全部楼层

Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?

保存到文件 D3DXSaveSurfaceToFile("E:\\pDesSurface1.tga",D3DXIFF_TGA,pSurface,NULL,NULL);
保存到内存 D3DXSaveSurfaceToFileInMemory(&ppDestBuf,D3DXIFF_TGA,pDesSurface,NULL,NULL);

1

主题

36

帖子

1442

积分

金牌会员

Rank: 6Rank: 6

积分
1442
发表于 2010-8-6 00:37:00 | 显示全部楼层

Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?

看错,试下D3DXIFF_DDS行不
D3DFMT_R32F保存到文件本来就是白色,有时还会是蓝色
但是重新读入应该不会有问题的吧

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2010-8-6 17:38:00 | 显示全部楼层

Re: Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?

yuxj: Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?

看错,试下D3DXIFF_DDS行不
D3DFMT_R32F保存到文件本来就是白色,有时还会是蓝色
但是重新读入应该不会有问题的吧


谢谢楼主回复,我回去试试。

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2010-8-6 17:38:00 | 显示全部楼层

Re:如何导出D3DFMT_R32F格式的ShadowMap到文件?

楼上。。。?濉

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2016-7-31 02:40:49 | 显示全部楼层
1.RenderTarget不能锁定 你进去看看锁定的操作返回的是失败
2.你导出的是RenderTarget数据 是场景 并非你说的shadowmap 而且也不明确你这里shadowmap的含义
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-18 07:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表