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);. 编辑: 根据user3125280的答案,我制作了一小段代码,该代码应该占据屏幕的左上角并平均.但是结果总是为0.我缺少什么? 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: EDIT3: >创建Direct3D 11.1设备. (也许以前的工作 – 我没有尝试,我不知道有没有理由使用D3D10 / 10.1 / 11设备.) 但是由于我对DirectX的不了解,我很难实施. edit4: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |