c++ - 检索要通过网络发送的 ID3D11Texture2D 数据

标签 c++ windows winapi directx dxgi

我正在修改桌面复制 api 示例 kindly provided by Microsoft捕获屏幕并通过网络将更新发送到我的应用程序。我知道如何实际发送数据;我的问题是从 ID3D11Texture2D 对象获取数据。

ID3D11Texture2D* m_AcquiredDesktopImage;
IDXGIResource* desktopResource = nullptr;
DXGI_OUTDUPL_FRAME_INFO FrameInfo;

// Get new frame
HRESULT hr = m_DeskDupl->AcquireNextFrame(500, &FrameInfo, &desktopResource);

// QI for IDXGIResource
hr = desktopResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void **>(&m_AcquiredDesktopImage));

此时,我认为屏幕更新在 m_AcquiredDesktopImage 中。我需要通过网络传输这些数据(尽可能高效)。

This answer似乎是在正确的轨道上,但我是 Windows 编程的新手,所以我需要一些额外的帮助。

这是我能想到的唯一使用IDXGIObject::GetPrivateData的解决方案

最佳答案

私有(private)数据根本不是您要找的。它们只是在这里将自定义值附加到 d3d 对象。

一旦有了需要从中读回图像的 ID3D11Texture2D 对象,就需要在 ID3D11Device 的暂存内存池中创建第二个对象(获取原始描述,更改池并删除绑定(bind))。

然后,您需要使用 ID3D11DeviceContext 使用 CopyResource 将纹理复制到暂存设备。然后您可以使用上下文 MapUnmap api 来读取图像。

关于c++ - 检索要通过网络发送的 ID3D11Texture2D 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165270/

相关文章:

c++ - glGetError 无限返回 1282

PHP ZipArchive 不添加任何文件 (Windows)

windows - 如何将目录添加到 Cygwin gcc 默认搜索路径

windows - Git Status 使用 Cygwin 挂起

c++ - 如何在 C++ 中打开特定应用程序后关闭它?

c - getenv ("APPDATA") 如果当前用户的用户名包含 unicode 字符,则返回不正确的值

c++ - 在新目录上设置可见列

c++ - 字符串的递归预处理器宏

c++ - 令人困惑的 (*this) 指针转换

c++ - 在 TRACE 调用后中断调试