游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4317|回复: 8

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

[复制链接]

11

主题

43

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2006-5-15 17:57:00 | 显示全部楼层 |阅读模式
程序代码如下:
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;
}

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

0

主题

237

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2006-5-15 19:05:00 | 显示全部楼层

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

Direct3DSurface/Texture是不能即接memcpy 的....

11

主题

43

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2006-5-16 12:37:00 | 显示全部楼层

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

那请问nlo,我如何得到Surface中的数据呢?

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-5-16 17:03:00 | 显示全部楼层

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

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

11

主题

43

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2006-5-16 17:34:00 | 显示全部楼层

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

to jk20012001,如果不LOCK,则取到的数据,是否不正确?

11

主题

43

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2006-5-17 11:21:00 | 显示全部楼层

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

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

D3D8中如何实现呢?

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-5-17 14:47:00 | 显示全部楼层

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

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

11

主题

43

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2006-5-18 11:13:00 | 显示全部楼层

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

谢谢!

17

主题

165

帖子

167

积分

注册会员

Rank: 2

积分
167
发表于 2006-5-18 16:08:00 | 显示全部楼层

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

Lock出来的部分除了你想Copy的以外,还有一些多余的部分,你直接memcpy是不行的.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 12:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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