2017-09-01 103 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緩衝。