不能够读取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是不行的.

读取D3D后备缓冲区的数据相关推荐

  1. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( 设置 ANativeWindow 缓冲区属性 | 获取绘制缓冲区 | 填充数据到缓冲区 | 启动绘制 )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 前置操作 II . FFMPEG 原生绘制流程 III . 设置 ANativeWindow 绘制窗口属性 ANativeWind ...

  2. 若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( )

    若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( A ) Ⅰ. 若该文件的数据不在内存,则该进程进入睡眠等待状态 Ⅱ. 请求read系统调用会导致CPU ...

  3. Linux内存管理:转换后备缓冲区(TLB)原理

    目录 分页中的转换后备缓冲区(TLB) TLB原理 TLB的本质是什么 TLB的特殊 TLB的别名问题 TLB的歧义问题 如何尽可能的避免flush TLB 如何管理ASID 更上一层楼 什么时候应该 ...

  4. STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数

    接着上一篇上传,这个是STM32配置CH375B时用到的接口函数 头文件: #ifndef __BSP_CH375_H__ #define __BSP_CH375_H__#include " ...

  5. 黑马毕向东Java课程笔记(day19-11——19-22)IO字节流:字节流及其读取、字节流缓冲区、自定义字节流(读取)的缓冲区、读取键盘的输入、读取/写入转换流、流操作规律

    1.字节流--File   字节流的介绍 字符流:(一个字符2个字节16位) FileReader FileWriter. BufferedReader BufferedWriter字节流:(一个字节 ...

  6. pandas使用read_csv函数读取文件并解析日期数据列(parse dates)、pandas使用read_csv函数读取文件并将缺失值转化为空字符串

    pandas使用read_csv函数读取文件并解析日期数据列(parse dates).pandas使用read_csv函数读取文件并将缺失值转化为空字符串 目录

  7. pandas使用read_csv函数读取文件最后N行数据并保留表头、pandas使用read_csv函数读取网络url链接数据

    pandas使用read_csv函数读取文件最后N行数据并保留表头.pandas使用read_csv函数读取网络url链接数据 目录

  8. pandas读取字典(dict)数据

    pandas读取字典(dict)数据 pandas.DataFrame.from_dict # 默认orient ='columns' # 默认orient ='columns' data = {'c ...

  9. 读取Assets中的文件数据

    首先在assets文件夹中新建一个text.text文件用来读取 读取文件代码如下: import java.io.BufferedReader; import java.io.IOException ...

最新文章

  1. python脚本 数据库压力测试_python-网站压力测试脚本
  2. 新机器学习库TensorFlow Privacy问世:旨在保护敏感数据
  3. 爬虫准备工作1-Java写入字符串到txt文档
  4. Exchange-批量创建通讯组邮箱
  5. STUN响应消息中添加MAPPED_ADDRESS
  6. 解读MD07中可供货天数的计算
  7. 树状数组 求 逆序对
  8. 关于在学校锻炼的思考
  9. druid 非对称加密_springboot配置文件中mysql的密码进行加密
  10. 爬虫:验证码识别准确率(Tesseract-OCR)
  11. The Cow Lexicon(POJ-3267)
  12. 采集gpu_GPU温度的采集
  13. 计算机毕业设计网吧管理,毕业设计50河北大学计算机毕业设计网吧管理系统.doc...
  14. Windows解压tar.gzip文件
  15. flow_from_directory返回值
  16. 如何改typecho主题头像_零成本搭建hexo个人博客(二)--修改主题
  17. VMware故障:配置文件(.vmx)损坏修复
  18. vue怎么调用子元素的方法_vue 父组件中调用子组件函数的方法
  19. Android应用客服系统解决方案---网易七鱼客服
  20. 2021年软考信息安全工程师下午真题(考生回忆版)

热门文章

  1. Nginx 源码分析
  2. Linux操作系统 - 信号
  3. ansible的变量和机密
  4. 深度学习目标检测模型综述
  5. Windows 找不到 gpedit.msc
  6. 用latex编写 的论文模版
  7. 学习如逆水行舟,不进则退
  8. TeXstudio编译提示缺少.sty文件
  9. jQuery功能简述
  10. jQuery的使用(每一步都有注释说明,结构清晰,非常适合初学者,结合实例,通俗易懂,附带jQuery安装方法)