利用D3D抓取GPU数据
来源:互联网 发布:cf手游刷钻软件注册码 编辑:程序博客网 时间:2024/05/16 05:33
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();
- 利用D3D抓取GPU数据
- 利用D3D抓取GPU数据
- 利用D3D抓取GPU数据
- 利用D3D抓取显存数据
- 利用WebClient进行数据抓取
- 利用WebClient进行数据抓取
- 利用Java抓取网页数据
- 利用bs模块抓取数据
- 利用Jsoup抓取网络数据
- 利用Fiddler抓取APP数据
- 利用GPU实现向量数据的相加
- 利用原始套接字抓取数据
- 利用Java抓取网页数据步骤
- 利用HtmlUnit 模拟浏览器抓取网页数据
- 利用python抓取京东的数据
- 如何利用Charles抓取app中的数据
- Android利用jsoup抓取网页数据
- 利用Abot 抓取博客园新闻数据
- 游戏编程入门学习笔记21——网络篇——信息收发
- 版本控制 --- 1. 你干嘛要用Git(单人寂寞版)
- 9.2.2邻接表存储方法
- 软件开发与测试阶段对照图
- Apache2.2配置aspx运行环境
- 利用D3D抓取GPU数据
- django入门笔记10 - contrib
- spring预备知识-设计域模型和服务层
- django入门笔记11 - 中间件(拦截器)
- 9.2.3 十字邻接表存储方法
- Android系统版本SDK_INT与版本对应关系
- 黑马程序员--java IO流(二)
- 关于跨站
- 枚举