2016-03-25 91 views
1

Можно ли сделать захват экрана приложения DirectX (игра для примера) в D3D11?D3D11 Screen Capture in C++

я могу сделать это легко в DirectX 9 или API подсекать (IDXGISwapChain :: Present), но невозможно с DirectX 11.

Я D3D11 и инициализировать создать SwapChain с окном игры (FindWindow()), тогда я получаю BackBuffer,

затем ID3D11Texture2D :: GetDesc() использовать его в ID3D11Device :: CreateTexture2D(), затем ID3D11DeviceContext :: CopyResource() , который дает мне новый ID3D11Texture2D ресурс.

Когда я сохраняю его обычными способами, как D3DX11SaveTextureToFile(), я всегда получаю черное изображение.

Что я забыл?

Спасибо.

+1

Это возможно, но не тривиально, так как вы должны сделать API подключения вы упоминаете. Проект OBS, вероятно, делает это «где-то в своём коде», см. Также http://stackoverflow.com/questions/5069104/fastest-method-of-screen-capturing – rogerdpack

+0

Если вы нацеливаете клиентов Windows 8, API Duplication Desktop - это способ пойти : https://msdn.microsoft.com/library/windows/desktop/hh404487.aspx –

+0

OBS использует указанный мной крючок (файл DXGICapture.cpp). Это легко, как с DirectX9, но я не понимаю, почему аналогичный метод с DirectX11 дает черное изображение. –

ответ

0

Я думаю, что здесь есть два шага, чтобы проверить код:

  1. ID3D11DeviceContext :: CopyResource() он работает, как ожидалось? Как известно, этот func требует строгого очерка src и des, src tex имеет некоторый diff desc из des tex. вы можете выводить в окно непосредственно, чтобы проверить перед сохранением.

  2. D3DX11SaveTextureToFile является устаревшим, который заменено SaveToXXXFile (где XXX является WIC, DDS или TGA; WIC не поддерживает ДДС и ТГ; D3DX 9 поддерживают TGA в качестве исходного формата общего искусства для игр). Библиотека DirectXTex и DirectXTK является новой. Но он все еще работает, если вы настроите его соответствующим образом. проверьте это возвращаемое значение func. Убедитесь, что вы знаете, как использовать

    HRESULT D3DX11SaveTextureToFile(
         ID3D11DeviceContext  *pContext, 
        _In_ ID3D11Resource   *pSrcTexture, 
        _In_ D3DX11_IMAGE_FILE_FORMAT DestFormat, 
        _In_ LPCTSTR     pDestFile 
    );