2017-09-01 100 views
0

我有一些D3D11过程中,我挂钩捕捉帧。如果进程调用Present(),有捕捉框架没有问题,但... 在某些情况下,它是不可见的和不存在()方法被调用,但帧渲染真的。我可以连接Draw(),ExecudeCommandList()(和其他)方法。实际上,没有Present()调用,所以我无法访问SwapChain的backbuffer。我想在应用程序运行w/o窗口时没有创建SwapChain。钩到D3D11过程没有现在和抢的Texture2D

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

使用API​​监控我抓获D3D11的一些信息要求在每一帧的末尾:

API calls at the end of frame

没有人有任何想法,我怎样才能得到的框架?我的目的是让框架进入D3D11Texture2D。

谢谢!

UPD:

我发现,这种方法可以对我有所帮助:ID3D11DeviceContext::ResolveSubresource,但我不能处理它钩。这是摊销(在主应用程序,我试图抓住帧)。

虚函数表日志的部分:

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

谢谢2!

+0

好像你正试图钩使用DirectComposition的应用程序:https://msdn.microsoft.com/en-us/library/windows/desktop/hh437371%28v=vs.85%29.aspx?f = 255&MSPPError = -2147217396。您是否试图连接到Internet Explorer? DirectComposition不会发出Present calls。据我所知,它直接发送(共享)纹理到DWM。您可能需要挂钩DirectComposition或CreateTexture调用,并试图以何种方式捕获纹理内容。 – VuVirt

+0

不,这是使用简单渲染转换的d3d11应用程序。如果输出窗口没有显示,这个应用程序会停止调用'Present'。这是3D游戏中间件。 我试图挂钩'CreateTexure2D',但最好的选择是'ResolveSubresource'。我无法挂钩它,因为它在主应用程序中是** amortized **。 –

回答

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"); 

或者你可以节省输出合并(OM)阶段的Texture2D缓冲。