挂钩到没有 Present 的 D3D11 进程并获取 Texture2D

Hook to a D3D11 process without Present and grab Texture2D

我正在连接一些 D3D11 进程来捕获帧。如果进程调用Present(),捕获帧没有问题,但是...... 在某些情况下,它没有可见的 window 并且没有调用 Present() 方法,但框架确实被渲染了。我可以连接 Draw()ExecudeCommandList()(和其他)方法。实际上,没有调用 Present(),所以我无权访问 SwapChain 的后备缓冲区。我想当应用程序是 运行 w/o window.

时没有创建 SwapChain

当我挂钩 Draw()ExecuteCommandList() 时,我只能访问 D3D11DeviceD3D11DeviceContext

使用 API 监视器我在每帧末尾捕获了一些关于 D3D11 调用的信息:

有谁知道我怎样才能得到结果帧?我的目的是将框架放入 D3D11Texture2D。

谢谢!

更新:

我发现这个方法对我有帮助:ID3D11DeviceContext::ResolveSubresource,但我无法处理它。它是 amortized(在主应用程序中我正在尝试抓取帧)。

部分VTable日志:

[56]    5E225520    (CContext::TID3D11DeviceContext_GetResourceMinLOD_<1>)
[57]    5E1B95C0    (CContext::TID3D11DeviceContext_ResolveSubresource_Amortized<1>)
[58]    5E21DEC0    (CContext::TID3D11DeviceContext_ExecuteCommandList_<1>)

谢谢2!

如果您可以在任何挂钩的 D3D11 方法中访问 ID3D11DeviceContext,您可以尝试调用 OMGetRenderTargets 方法并从中获取资源:

ID3D11RenderTargetView *view = NULL;
pContext->OMGetRenderTargets(1, &view, NULL);
ID3D11Resource *pSourceResource = NULL;
view->GetResource(&pSourceResource);

然后您可以将其作为 Texture2D 保存到文件中:

D3DX11SaveTextureToFile(pContext, pSourceResource, D3DX11_IFF_BMP, "image.bmp");

或者您可以在输出合并 (OM) 阶段保存 Texture2D 缓冲区。