2016-03-25 58 views
1

D3D11でDirectXアプリケーション(例えばゲーム)のスクリーンキャプチャを行うことはできますか?C++でのD3D11画面キャプチャ

私はD3D11をinitalizeとゲーム画面(のFindWindow())とSwapChainを作成するのDirectX 9またはAPIフッキング(IDXGISwapChain ::現在)で簡単にそれを行うが、DirectXの11

では不可能することができ、 はその後、私は ID3D11Device :: CreateTexture2D()、 その後、 ID3D11DeviceContext :: COPYRESOURCE() 私に新しいID3D11Texture2Dリソースを与えるには、それを使用してバックバッファ、

その後、 ID3D11Texture2D :: GetDesc() を取得します。

D3DX11SaveTextureToFile()のような通常の方法で保存すると、常に黒い画像が表示されます。

私は何を忘れましたか?

ありがとうございました。

+1

を使用する方法を知っているようにしてください。 OBSプロジェクトはおそらく "コードのどこか"にありますhttp://stackoverflow.com/questions/5069104/fastest-method-of-screen-capturing – rogerdpack

+0

Windows 8クライアントをターゲットにする場合は、Desktop Duplication APIを使用してください:https://msdn.microsoft.com/library/windows/desktop/hh404487.aspx –

+0

OBSは引用したフックを使用します(DXGICapture.cppファイル)。 DirectX9のように簡単ですが、なぜDirectX11と同様の方法で黒い画像が得られるのでしょうか –

答えて

0

私はあなたのコードをチェックするために2段階あり、ここだと思う:

  1. ID3D11DeviceContextを:: COPYRESOURCE()期待どおりに動作しますか?わかっているように、この関数はsrcとdesの厳密に同じdescを必要とし、src texはdes texからのdiffをいくつか持っています。保存する前にウィンドウに直接出力して確認することができます。

  2. D3DX11SaveTextureToFileはSaveToXXXFileで置換され、廃止され(XXXはWICで、DDS、またはTGA; D3DX 9ゲームのための共通の技術ソースフォーマットとしてTGAを支持し、WICは、DDSおよびTGAがサポートしていません)。 DirectXTexとDirectXTKライブラリは新しいものです。しかし、あなたが適切に設定すれば今でも動作します。このfuncの戻り値を確認してください。あなたが言及あなたをフックAPIを行う必要があるでしょうので、それは些細可能ですが、ありませんか

    HRESULT D3DX11SaveTextureToFile(
         ID3D11DeviceContext  *pContext, 
        _In_ ID3D11Resource   *pSrcTexture, 
        _In_ D3DX11_IMAGE_FILE_FORMAT DestFormat, 
        _In_ LPCTSTR     pDestFile 
    ); 
    
関連する問題