0

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

当我 hook Draw()orExecuteCommandList()时,我只能访问D3D11Deviceand D3D11DeviceContext

使用 API 监视器,我在每一帧结束时捕获了有关 D3D11 调用的一些信息:

在此处输入图像描述

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

谢谢!

升级版:

我发现这种方法对我有帮助:ID3D11DeviceContext::ResolveSubresource,但我无法处理它。它是摊销的(在主应用程序中我试图抓取框架)。

VTable 日志的一部分:

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

谢谢2!

4

1 回答 1

0

如果您可以在任何挂钩的 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");

或者您可以将 Texture2D 缓冲区保存在 Output-Merger (OM) 阶段。

于 2017-09-06T13:07:59.463 回答