Dev*_*oid 4 c++ windows directx pixel
我正在使用Windows桌面复制API来制作自己的镜像协议.我有这段代码:
// Get new frame
HRESULT hr = m_DeskDupl->AcquireNextFrame(500, &FrameInfo, &DesktopResource);
if (hr == DXGI_ERROR_WAIT_TIMEOUT)
{
*Timeout = true;
return DUPL_RETURN_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
这是FrameInfo结构:
`typedef struct _FRAME_DATA {
ID3D11Texture2D* Frame;
DXGI_OUTDUPL_FRAME_INFO FrameInfo;
_Field_size_bytes_((MoveCount * sizeof(DXGI_OUTDUPL_MOVE_RECT)) + (DirtyCount * sizeof(RECT))) BYTE* MetaData;
UINT DirtyCount;
UINT MoveCount;
} FRAME_DATA;`
Run Code Online (Sandbox Code Playgroud)
我想提取像素缓冲区从ID3D11Texture2D* Frame;
如何提取BYTE *或unsigned char *具有RGB序列?谢谢 !
您需要创建一个具有CPU读取访问权限的相同大小的第二个纹理,使用ID3D11Device::CreateTexture2D或复制整个框架或仅更新部件到此纹理使用ID3D11DeviceContext::CopyResource或ID3D11DeviceContext::CopySubresourceRegion(可以检索哪些部分使用IDXGIOutputDuplication::GetFrameDirtyRects和更新IDXGIOutputDuplication::GetFrameMoveRects),映射第二个纹理以使它可以通过CPU访问,ID3D11DeviceContext::Map它为你提供D3D11_MAPPED_SUBRESOURCE包含指向缓冲区的指针的结构,包括帧数据和它的大小,这就是你要找的东西.
Microsoft提供了一个相当详细的桌面复制API使用示例,它实现了上述所有步骤.
还有一个直接的示例演示了如何将ID3D11Texture2D数据保存到文件中.