HRESULT GetBackBuffer(
[in]          UINT                iSwapChain,
[in]          UINT               BackBuffer,
[in]          D3DBACKBUFFER_TYPE Type,
[out, retval] IDirect3DSurface9  **ppBackBuffer
);

Parameters

iSwapChain [in]

Type: UINT

An unsigned integer specifying the swap chain.

BackBuffer [in]

Type: UINT

Index of the back buffer object to return. Back buffers are numbered from 0 to the total number of back buffers minus one. A value of 0 returns the first back buffer, not the front buffer. The front buffer is not accessible through this method. Use IDirect3DDevice9::GetFrontBufferData to retrieve a copy of the front buffer.

Type [in]

Type: D3DBACKBUFFER_TYPE

Stereo view is not supported in Direct3D 9, so the only valid value for this parameter is D3DBACKBUFFER_TYPE_MONO.

ppBackBuffer [out, retval]

Type: IDirect3DSurface9**

Address of a pointer to an IDirect3DSurface9 interface, representing the returned back buffer surface.

Return value

Type: HRESULT

If the method succeeds, the return value is D3D_OK. If BackBuffer equals or exceeds the total number of back buffers, then the function fails and returns D3DERR_INVALIDCALL.

Remarks

Calling this method will increase the internal reference count on the IDirect3DSurface9 interface. Failure to call IUnknown::Release when finished using this IDirect3DSurface9 interface results in a memory leak.

https://msdn.microsoft.com/en-us/library/bb174379(VS.85).aspx

利用 GetBackBuffer 截屏问题:

截取windows桌面保存的画面是黑的问题。

m_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, ddm.Format, D3DPOOL_SYSTEMMEM, &m_pSurface, NULL)

IDirect3DSurface9*    pBlackSurface = NULL;
m_pd3dDevice->GetBackBuffer(,,D3DBACKBUFFER_TYPE_MONO,&pBlackSurface);
m_pd3dDevice->GetRenderTargetData(pBlackSurface,m_pSurface);
D3DXSaveSurfaceToFile("E:\\test.bmp",D3DXIFF_BMP,m_pSurface,NULL, NULL);

为什么截屏生成的图片全是黑的呀 (黑屏)??

用GetFrontBufferData截屏是可以的,但测试了一下在我的机器上最多一秒截23帧图像,网上说用GetBackBuffer和 GetRenderTargetData 会快一些,但是为什么我的截出来的是黑屏呢?
还有个问题 GetFrontBufferData 和 GetRenderTargetData 好像都是从显存里把数据考到内存里(是吗??) 为什么GetBackBuffer加 GetRenderTargetData的截屏组合会比GetFrontBufferData截屏快一些呢?

--------------------------------

IDirect3DDevice9 :: GetFrontBufferData方法
生成设备前端缓冲区的副本,并将该副本放置在应用程序提供的系统内存缓冲区中。

备注:
由pDestSurface指向的缓冲区将填充前缓冲区的表示,转换为每像素格式的标准32位D3DFMT_A8R8G8B8。

此方法是捕获反锯齿屏幕快照的唯一方法。

这个功能在设计上非常慢,不应该用在任何性能关键的路径上。

----------------------------------

GetFrontBufferData  是返回一个Copy, 有复制的过程,在复制的时候可能还要考虑到显卡当前是否正在使用其内容做处理

GetBackBuffer,Retrieves a back buffer from the swap chain of the device.
   这个是不需要转换的

看GetFrontBufferData的说明,  这个办法是唯一的可以把反混淆的效果也带回来的
反混淆本身就是一个很浪费时间的操作,它也只发生在frontbuffer上

-----------------------------------

windows桌面不用后缓冲,所以后缓冲是黑的

------------------------------

最新的WIN8上的API,DWM截屏。通过D3D9的话只有这个方法了。

http://bbs.csdn.net/topics/390430991

===========================================================================

利用D3D抓取GPU数据

microsoft 提供的D3D SDK是用来进行3D建模和利用GPU运算的一组接口的集合,

D3D SDK至少有两个优点:

1、提供了一种3D建模的构架,程序员可以很容易的用这种构架来建模自己的3D模型

2、提供了一种GPU和CPU并行运算的解决方案,,为提供应用程序的性能提供了一种思路

这些对于D3D 程序员应该并不陌生,具体可以参见Direct 3D SDK文档。

这篇文章主要想讲一个在D3D编程中经常遇到的一个问题,从GPU中把数据取出,存入本地磁盘中。这个功能的应用也应该比较常见,例如保存游戏录像视频等。实现GPU to CPU拷贝的D3D 方法还是比较多的,但对于视频转存来说,能达到实时转存效果才有真正的利用价值。

这里首先简要介绍一下D3D 渲染的基本流程:

1. D3D setting states//设置渲染环境

2. g_pd3dDevice->beginscene();

3. D3D 管线渲染

4. g_pd3dDevice->EndScene();

至此,D3D的渲染过程已经结束,渲染处理的最终数据被存于D3D surface(这是在GPU中开辟的存储区域), 下面可以根据具体的需求来对该surface进行后处理:

1 直接显示:g_pd3dDevice->present();

2 转存到本地磁盘,即GPU to CPU的copy.

这里给出比较常见的一种处理方法:

g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackbuffer);

pBackbuffer->LockRect(&Source,NULL,0);

copy(Dest,Source);

pBackbuffer->UnLock();

这种方法缺点很严重,就是由于IPtrD3dsurface lock的内存是位于显卡中,这样在做copy(Dest,Source)的时候,非常缓慢,基本无法实现实时转存的要求。

那microsoft有没有提供更好的解决方案呢?哈哈,答案是肯定的,直接上代码:

g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackbuffer);

g_pd3dDevice->CreateOffscreenPlainSurface(d3dpp.BackBufferWidth,

d3dpp.BackBufferHeight,d3dpp.BackBufferFormat,D3DPOOL_SYSMEM,&g_p2DSurface,NULL);

g_pd3dDevice->GetRenderTargetData(pBackbuffer, g_p2DSurface);

g_p2DSurface->LockRect(&Source,NULL,0);

copy(Dest,Source);

g_p2DSurface->UnLock();

 
这段代码的处理速度是很赞的,对于正在急于寻找处理方法而又看到我这篇文章的朋友将是很幸运的。
至于其深层的原因,关键还是取决去CreateOffscreenPlainSurface函数,这个函数在内存中开辟了一块区域g_p2DSurface,microsoft可能采取了某种策略使得这块内存区域是最利于GPU拷贝的。真正的本质原因由于没有看过源代码,也不是很清楚。
http://blog.csdn.net/seamanj/article/details/8878421

D3D-GetBackBuffer &GetFrontBufferData 抓屏&D3D抓取GPU数据的更多相关文章

  1. Windows桌面共享中一些常见的抓屏技术

    1. BitBlt 我想做Windows开发应该都知道这个API, 它能实现DC间的内容拷贝, 如果我们把源DC指定成Monitor DC或是桌面DC, 它就能实现抓屏功能. 对于通过这种方式的抓屏, ...

  2. Windows抓屏技术

    Windows桌面共享中一些常见的抓屏技术 1. BitBlt   我想做Windows开发应该都知道这个API, 它能实现DC间的内容拷贝, 如果我们把源DC指定成Monitor DC或是桌面DC, ...

  3. Java语言实现通过Ajax抓取后台数据及图片

    1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计: create table picture( pic_id number not null, pic_name )not nu ...

  4. Charles 如何抓取https数据包

    Charles可以正常抓取http数据包,但是如果没有经过进一步设置的话,无法正常抓取https的数据包,通常会出现乱码.举个例子,如果没有做更多设置,Charles抓取https://www.bai ...

  5. 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

    上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...

  6. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  7. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  8. iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  9. Node.js的学习--使用cheerio抓取网页数据

    打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据. 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据. 关键是抓取到网页 ...

随机推荐

  1. Git创建仓库的方法(github翻译)

    …通过命令行创建一个新的仓库 echo "# GitTest" >> README.md # 船舰一个说明文件,说明内容是 "# GitTest" ...

  2. 《Agile Web Development With Rails》读后感--rails基于web设计的best Practices

    最近看完<Agile Web Development with Rails>一书,受益匪浅.书中先是用一个简单的web应用带你进入Rails的世界,然后在你大致熟悉之后,再带你了解Rail ...

  3. linux find查找并拷贝 exec xargs区别

    -exec    1.参数是一个一个传递的,传递一个参数执行一次rm    2.文件名有空格等特殊字符也能处理-xargs     1.一次将参数传给命令,可以使用-n控制参数个数    2.处理特殊 ...

  4. Java 反射机制介绍

    参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...

  5. Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件

    转载自:https://blog.csdn.net/lanxuezaipiao/article/details/21896579 我以下面三个包为例:(三个包都在/etc/opt下) A. examp ...

  6. 2018-2019-2 《网络对抗技术》Exp5 msf 20165222

    本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 总计:主动:ms17_010永恒之蓝(成功): 浏览器:office_word_hta(成功): 客户 ...

  7. EXCEL中如何删除透视表的多余汇总

    EXCEL中如何删除透视表的多余汇总 1)如下图,选中字段列,单击鼠标右键,在弹出的菜单中选择[字段设置]选项. 2)弹出[字段设置]对话框. 3)选择“分类汇总和筛选”选项卡,然后勾选“无”选项,单 ...

  8. PHP 中的文本截取分析之效率

    PHP 中的文本截取分析之效率 在使用 ThinkPHP 或 Laravel 时都会有用到文本截取的帮助函数. 分别是 msubstr (ThinkPHP 3,ThinkPHP 5 没找到) mb_s ...

  9. socket测试远程地址能否连接并为连接设置超时(转)

    public   class TestConnect { string hostIp = ""; int port = 3314; public string recMsg = & ...

  10. android studio安装须知

    64位linux,默认会提示mksdcard错误什么的,需要安装一个库 sudo apt- android sdk的下载,自己找代理服务器吧,哎……