1

是否可以在 D3D11 中对 DirectX 应用程序(例如游戏)进行屏幕截图?

我可以在 DirectX 9 或 API 挂钩 (IDXGISwapChain::Present) 中轻松做到这一点,但在 DirectX 11 中是不可能的。

我初始化 D3D11 并使用游戏窗口 (FindWindow()) 创建 SwapChain,然后得到 BackBuffer,

然后 ID3D11Texture2D::GetDesc() 在 ID3D11Device::CreateTexture2D() 中使用它,然后 ID3D11DeviceContext::CopyResource() 给了我一个新的 ID3D11Texture2D 资源。

当我用 D3DX11SaveTextureToFile() 之类的常用方法保存它时,我总是得到一个黑色图像。

我忘记了什么?

谢谢。

4

1 回答 1

0

我认为这里有两个步骤来检查您的代码:

  1. ID3D11DeviceContext::CopyResource() 是否按预期工作?众所周知,这个函数需要src和des的desc严格相同,是src tex与des tex有一些差异。您可以在保存前直接输出到窗口进行检查。

  2. D3DX11SaveTextureToFile 已弃用,取而代之的是 SaveToXXXFile(其中 XXX 是 WIC、DDS 或 TGA;WIC 不支持 DDS 和 TGA;D3DX 9 支持将 TGA 作为游戏的常见艺术源格式)。DirectXTex 和 DirectXTK 库是新的。但如果你配置得当,它现在仍然有效。检查这个函数返回值。确保你知道如何使用

    HRESULT D3DX11SaveTextureToFile(
           ID3D11DeviceContext      *pContext,
      _In_ ID3D11Resource           *pSrcTexture,
      _In_ D3DX11_IMAGE_FILE_FORMAT DestFormat,
      _In_ LPCTSTR                  pDestFile
    );
    
于 2017-04-16T15:32:26.277 回答