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

我可以在DirectX 9或API挂钩(IDXGISwapChain :: Present)中轻松完成此操作,但在DirectX 11中则无法实现。

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

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

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

我忘记了什么?

谢谢。

最佳答案

我认为这里分两步检查您的代码:


ID3D11DeviceContext :: CopyResource()是否按预期工作?众所周知,此函数要求src和des严格相同的desc,因为src tex与des tex有一些区别。您可以直接输出到窗口进行检查,然后再保存。
不推荐使用D3DX11SaveTextureToFile,而由SaveToXXXFile(其中XXX是WIC,DDS或TGA; WIC不支持DDS和TGA; D3DX 9支持TGA作为游戏的通用美术源格式)取代。 DirectXTex和DirectXTK库是新的。但是,如果您进行适当的配置,它现在仍然可以工作。检查此func返回值。确保您知道如何使用

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

关于c++ - C++中的D3D11屏幕捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36224525/

10-12 06:22