读取D3D后备缓冲区的数据

不能够读取D3D后备缓冲区的数据? 

[复制链接]
  

hs_491

电梯直达跳转到指定楼层

1

 发表于 2006-5-15 17:57:00 | 只看该作者 回帖奖励

游戏程序
平台类型: 
程序设计: 
编程语言: 
引擎/SDK: 
程序代码如下:
void GetScreenBuf (BYTE *buff, int width, int height)
{
        LPDIRECT3DSURFACE8 back = NULL;


        // 获得BackBuffer的D3D Surface
        LPBYTE tmp = new BYTE[width*height*4];
        HRESULT hr;
        hr = g_pd3dDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &back);

        D3DLOCKED_RECT lr;
        back->LockRect(&lr, NULL, 0);

        memcpy( tmp, (BYTE*)lr.pBits, width*height*4 );

        back->UnlockRect();


        // 释放Surface,防止内存泄漏
        back->Release();
        back = NULL;
               delete[] tmp;
}

我想得到Render之前的数据,但是运行到memcpy时出现错误?
而且用back->LockRect(&lr, NULL, 0);,得到的lr,两个值都为0.可能是没有锁定,不知道为什么?

但用下面程序,却可以保存成BMP文件.
void ScreenShot (char *filename, int width, int height)
{
        LPDIRECT3DSURFACE8 back = NULL;

        // 获得BackBuffer的D3D Surface
        g_pd3dDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &back);

        // Copy一下,,需要时转换颜色格式
        //D3DXLoadSurfaceFromSurface(tmp, NULL, NULL, back, NULL, NULL, D3DX_FILTER_NONE, 0);

        // 保存成BMP格式
        D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, back, NULL, NULL);

        // 释放Surface,防止内存泄漏
        //tmp->Release();
        //tmp = NULL;
        back->Release();
        back = NULL;
}

请问我的问题出现在哪里?
谢谢!

收藏收藏 支持支持 反对反对

 回复

举报

  

nlo

2

 发表于 2006-5-15 19:05:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

Direct3DSurface/Texture是不能即接memcpy 的....
 
 回复 支持 反对

举报

  

hs_491

3

  楼主| 发表于 2006-5-16 12:37:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

那请问nlo,我如何得到Surface中的数据呢?
 
 回复 支持 反对

举报

  

jk20012001

4

 发表于 2006-5-16 17:03:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

在创建设备时,PP结构体中的Flag指定D3DPRESENTFLAG_LOCKABLE_BACKBUFFER才能直接LOCK,不过不建议这么做,用d3ddevice的GetFrontBufferData函数可以直接得到BackBuffer的指针,不用去LOCK
 
 回复 支持 反对

举报

  

hs_491

5

  楼主| 发表于 2006-5-16 17:34:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

to jk20012001,如果不LOCK,则取到的数据,是否不正确?
 
 回复 支持 反对

举报

  

hs_491

6

  楼主| 发表于 2006-5-17 11:21:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

好像D3D8中没有D3DPRESENTFLAG_LOCKABLE_BACKBUFFER定义,也没有
GetFrontBufferData API接口?
你说的好像都是D3D9的API.

D3D8中如何实现呢?
 
 回复 支持 反对

举报

  

jk20012001

7

 发表于 2006-5-17 14:47:00 | 只看该作者

Re: 不能够读取D3D后备缓冲区的数据?

如果没指定该标记,Lock时会返回错误,你用HRESULT判断返回值就晓得了。。。D3D8里好像是没有GetFrontBufferData,不过D3DPRESENTFLAG_LOCKABLE_BACKBUFFER是有的啊。。。创建设备时,把D3DPRESENT_PARAMETERS结构体中的Flag成员设置成这个宏就行了。。。如果还是不行,试试d3ddevice的CopyRect函数吧。。。
 
 回复 支持 反对

举报

  

hs_491

8

  楼主| 发表于 2006-5-18 11:13:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

谢谢!
 
 回复 支持 反对

举报

  

kyo1984

9

 发表于 2006-5-18 16:08:00 | 只看该作者

Re:不能够读取D3D后备缓冲区的数据?

Lock出来的部分除了你想Copy的以外,还有一些多余的部分,你直接memcpy是不行的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值