C++ 如何使用DX11拍摄屏幕截图?

C++ 如何使用DX11拍摄屏幕截图?,c++,directx,directx-11,C++,Directx,Directx 11,我正在为DX11游戏编写插件,我需要截图并将其保存到文件中。我找到了一些使用函数D3DX11SaveTextureToFile的代码片段,但我就是无法让它工作。以下是我到目前为止所做的:(为了简单起见,错误检查和无关代码被删除) void屏幕截图(IDXGISwapChain*pSwapChain) { ID3D11设备*pDevice; pSwapChain->GetDevice(uu uuidof(ID3D11Device),重新解释cast(&pDevice)); ID3D11Device

我正在为DX11游戏编写插件,我需要截图并将其保存到文件中。我找到了一些使用函数
D3DX11SaveTextureToFile
的代码片段,但我就是无法让它工作。以下是我到目前为止所做的:(为了简单起见,错误检查和无关代码被删除)

void屏幕截图(IDXGISwapChain*pSwapChain)
{
ID3D11设备*pDevice;
pSwapChain->GetDevice(uu uuidof(ID3D11Device),重新解释cast(&pDevice));
ID3D11DeviceContext*pContext;
pDevice->GetImmediateContext(&pContext);
ID3D11Texture2D*pBackBuffer;
pSwapChain->GetBuffer(0,u-uuidof(ID3D11Texture2D),重新解释强制转换(&pBackBuffer));
D3D11_TEXTURE2D_DESC txtDesc;
pBackBuffer->GetDesc(&txtDesc);
txtDesc.Usage=D3D11\u Usage\u STAGING;
txtDesc.BindFlags=0;
txtDesc.CPUAccessFlags=D3D11\u CPU\u访问\u读取;
//txtDesc.Format==DXGI_Format_B8G8R8A8_UNORM
ID3D11Texture2D*pBackBufferStaging;
pDevice->CreateTexture2D(&txtDesc、nullptr和pBackBufferStaging);
pContext->copyrource(pBackBufferStaging,pBackBuffer);
HRESULT hr=D3DX11SaveTextureToFileA(pContext,pBackBufferStaging,D3DX11_IFF_PNG,“E:\\screenshot.PNG”);
//hr==E_失败
pBackBufferStaging->Release();
pBackBuffer->Release();
}
我得到了一个
E_FAIL
错误,经过一些研究,似乎
D3DX11SaveTextureToFile
不支持纹理格式
DXGI_格式\u B8G8R8A8_UNORM
,这是我假设的游戏所使用的。如果我手动将格式设置为类似于
DXGI_format_R8G8B8A8_UNORM
的格式,该功能将成功,但我只会得到一个黑色图像。我认为
copyrource
要求源和目标具有相同的格式

我知道有DirectXTK库,但我坚持使用VS2013,如果我正确阅读它的自述文件,DirectXTK似乎不支持它

编辑
DirectXTK/DirectXTex工作完美。

使用DirectX工具包中的模块是最佳选择。它可以编写
DDS
文件或WIC支持的各种格式,
JPG
包括:

using namespace DirectX;
using namespace Microsoft::WRL;

ComPtr<ID3D11Texture2D> backBuffer;
HRESULT hr = swapChain->GetBuffer( 0,
    __uuidof( ID3D11Texture2D ),
   reinterpret_cast<LPVOID*>( backBuffer.GetAddressOf() ) );
if ( SUCCEEDED(hr) )
{
    hr = SaveWICTextureToFile( immContext.Get(), backBuffer.Get(),
                GUID_ContainerFormatJpeg, L"SCREENSHOT.JPG" );
}
DX::ThrowIfFailed(hr);
使用名称空间DirectX;
使用名称空间Microsoft::WRL;
ComPtr backBuffer;
HRESULT hr=swapChain->GetBuffer(0,
__uuidof(ID3D11D),
重新解释强制转换(backBuffer.GetAddressOf());
如果(成功(hr))
{
hr=SaveWICTextureToFile(immContext.Get(),backBuffer.Get(),
GUID_包含ATJPEG,L“SCREENSHOT.JPG”);
}
DX::ThrowIfFailed(hr);
我最近从我的GitHub项目中放弃了对Visual Studio 2013的支持——有关详细信息,请参阅。如果您无法升级,您可以使用稍旧的2018年4月版,它支持VS 2013

通常,D3DX9、D3DX10和D3DX11与DirectX SDK一起被弃用

使用DirectX工具包中的模块是最好的选择。它可以编写
DDS
文件或WIC支持的各种格式,
JPG
包括:

using namespace DirectX;
using namespace Microsoft::WRL;

ComPtr<ID3D11Texture2D> backBuffer;
HRESULT hr = swapChain->GetBuffer( 0,
    __uuidof( ID3D11Texture2D ),
   reinterpret_cast<LPVOID*>( backBuffer.GetAddressOf() ) );
if ( SUCCEEDED(hr) )
{
    hr = SaveWICTextureToFile( immContext.Get(), backBuffer.Get(),
                GUID_ContainerFormatJpeg, L"SCREENSHOT.JPG" );
}
DX::ThrowIfFailed(hr);
使用名称空间DirectX;
使用名称空间Microsoft::WRL;
ComPtr backBuffer;
HRESULT hr=swapChain->GetBuffer(0,
__uuidof(ID3D11D),
重新解释强制转换(backBuffer.GetAddressOf());
如果(成功(hr))
{
hr=SaveWICTextureToFile(immContext.Get(),backBuffer.Get(),
GUID_包含ATJPEG,L“SCREENSHOT.JPG”);
}
DX::ThrowIfFailed(hr);
我最近从我的GitHub项目中放弃了对Visual Studio 2013的支持——有关详细信息,请参阅。如果您无法升级,您可以使用稍旧的2018年4月版,它支持VS 2013

通常,D3DX9、D3DX10和D3DX11与DirectX SDK一起被弃用