c – 计算gpu前缓冲区中的像素平均值,而不将前缓冲区复制回系统内存

我准备为我的电脑建立一个环保的克隆.
为此,我需要一种方法来计算屏幕几个区域的平均颜色.

到目前为止我发现的最快的方法如下:

pd3dDevice->CreateOffscreenPlainSurface(ddm.Width,ddm.Height,D3DFMT_A8R8G8B8,D3DPOOL_SCRATCH/*D3DPOOL_SYstemMEM*/,&pSurface,nullptr)
  pd3dDevice->GetFrontBufferData(0,pSurface);
  D3DLOCKED_RECT lockedRect;
  pSurface->LockRect(&lockedRect,nullptr,D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
  memcpy(pBits,(unsigned char*) lockedRect.pBits,dataLength);
  pSurface->UnlockRect();
  //calculate average over of pBits

但是它需要将整个前端缓冲区复制回系统内存,平均需要33 ms. Obviuosly 33ms没有接近速度,我需要一个体面的更新率,所以我正在寻找一种方法来计算在前端缓冲区直接在gpu的区域上的平均值,而无需将前端缓冲区复制回系统内存.

编辑:代码片段中的瓶颈是pd3dDevice-> GetFrontBufferData(0,pSurface);.
memcpy性能没有明显的影响.

编辑:

根据user3125280的答案,我制作了一小段代码,该代码应该占据屏幕的左上角并平均.但是结果总是为0.我缺少什么?
还要注意,pSurface现在在视频内存中,因此GetFrontBufferData只是一个超级快速的视频RAM中的memcpy.

pd3dDevice->CreateOffscreenPlainSurface(1,1,D3DPOOL_SCRATCH,&pAvgSurface,nullptr);
  pd3dDevice->CreateOffscreenPlainSurface(ddm.Width,D3DPOOL_DEFAULT,nullptr);

  pd3dDevice->GetFrontBufferData(0,pSurface);

  RECT r;
  r.right = 100;
  r.bottom = 100;
  r.left = 0;
  r.top = 0;
  pd3dDevice->StretchRect(pSurface,&r,pAvgSurface,D3DTEXF_LINEAR);

  D3DLOCKED_RECT lockedRect;
  pAvgSurface->LockRect(&lockedRect,D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
  unsigned int color = -1;
  memcpy((unsigned char*) &color,4); //FIXME there has to be a better way than memcopy
  pAvgSurface->UnlockRect();

EDIT2:
Apparantly GetFrontBufferData要求目标驻留在系统内存中.所以我回到了广场.

EDIT3:
根据this以下可能在DX11.1中:

>创建Direct3D 11.1设备. (也许以前的工作 – 我没有尝试,我不知道有没有理由使用D3D10 / 10.1 / 11设备.)
>找到要复制的IdxgiOutput,并调用DuplicateOutput()获取一个IdxgiOutputDuplication接口.
> Call AcquireNextFrame()等待一个新帧到达.
>处理收到的纹理.
>调用ReleaseFrame().
>重复.

但是由于我对DirectX的不了解,我很难实施.

edit4:
在Windows 8之前的操作系统中不支持DuplicateOutput

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...