2017-09-01 26 views
0

D3D11プロセスがあります。フレームをキャプチャするためにフックしています。プロセスがPresent()を呼び出す場合、フレームをキャプチャするのに問題はありませんが、 場合によっては可視ウィンドウがなく、Present()メソッドは呼び出されませんが、フレームは実際にレンダリングされます。私はDraw()ExecudeCommandList()(と他の)メソッドを接続することができます。実際には、私はSwapChainのバックバッファへのアクセス権がないので、呼び出されるPresent()はありません。私はスワップチェーンは、アプリケーションがウィンウィンドウを実行しているときに作成されていないと仮定します。現在のD3D11プロセスにフックし、Texture2Dを取得

Draw()またはExecuteCommandList()をフックすると、D3D11DeviceD3D11DeviceContextにしかアクセスできません。

私はD3D11のいくつかの情報をキャプチャAPIモニタを使用して、各フレームの最後で呼び出します。

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は現在の呼び出しを発行しません。私が理解する限り、テクスチャを直接DWMに送信(共有)します。 DirectCompositionやCreateTextureの呼び出しをフックして、いつテクスチャの内容をキャプチャするかを推測する必要があります。 – VuVirt

+0

いいえ、簡単なレンダリング変換を持つd3d11アプリです。出力ウィンドウが表示されていない場合、このアプリケーションは 'Present'の呼び出しを停止します。それは3Dゲームのミドルウェアです。 'CreateTexure2D'をフックしようとしましたが、最良の選択は' ResolveSubresource'です。メインアプリで**償却**されているので、私はそれをフックすることはできません。 –

答えて

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)ステージに保存することもできます。

関連する問題