挂钩到没有 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()
时,我只能访问 D3D11Device
和 D3D11DeviceContext
。
使用 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 缓冲区。
我正在连接一些 D3D11 进程来捕获帧。如果进程调用Present()
,捕获帧没有问题,但是......
在某些情况下,它没有可见的 window 并且没有调用 Present() 方法,但框架确实被渲染了。我可以连接 Draw()
、ExecudeCommandList()
(和其他)方法。实际上,没有调用 Present(),所以我无权访问 SwapChain 的后备缓冲区。我想当应用程序是 运行 w/o window.
当我挂钩 Draw()
或 ExecuteCommandList()
时,我只能访问 D3D11Device
和 D3D11DeviceContext
。
使用 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 缓冲区。