我正在为一个DX11游戏编写一个插件,我需要截图并将它保存到一个文件中。我找到了一些使用函数D3DX11SaveTextureToFile的代码片段,但是我无法让它工作。下面是我到目前为止所做的工作:(为了简单起见,删除了错误检查和无关代码)
void screenshot(IDXGISwapChain *pSwapChain)
{
    ID3D11Device *pDevice;
    pSwapChain->GetDevice(__uuidof(ID3D11Device), reinterpret_cast<void **>(&pDevice));
    ID3D11DeviceContext *pContext;
    pDevice->GetImmediateContext(&pContext);
    ID3D11Texture2D *pBackBuffer;
    pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void **>(&pBackBuffer));
    D3D11_TEXTURE2D_DESC txtDesc;
    pBackBuffer->GetDesc(&txtDesc);
    txtDesc.Usage = D3D11_USAGE_STAGING;
    txtDesc.BindFlags = 0;
    txtDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    // txtDesc.Format == DXGI_FORMAT_B8G8R8A8_UNORM
    ID3D11Texture2D *pBackBufferStaging;
    pDevice->CreateTexture2D(&txtDesc, nullptr, &pBackBufferStaging);
    pContext->CopyResource(pBackBufferStaging, pBackBuffer);
    HRESULT hr = D3DX11SaveTextureToFileA(pContext, pBackBufferStaging, D3DX11_IFF_PNG, "E:\\screenshot.png");
    // hr == E_FAIL
    pBackBufferStaging->Release();
    pBackBuffer->Release();
}我得到了一个E_FAIL错误,经过一些研究后,似乎D3DX11SaveTextureToFile不支持纹理格式DXGI_FORMAT_B8G8R8A8_UNORM,这是我假设的游戏所使用的。如果我手动将格式设置为类似于DXGI_FORMAT_R8G8B8A8_UNORM的格式,函数将成功,但我只会得到一个黑色的图像。我认为CopyResource要求源和目的地具有相同的格式。
我知道有DirectXTK库,但是我被VS2013困住了,如果我正确阅读它的自述文件,DirectXTK似乎不支持它。
编辑
DirectXTK/DirectXTex工作得完美无缺。
发布于 2018-06-14 06:42:00
使用ScreenGrab工具包中的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);我最近从我的GitHub项目中放弃了对Visual 2013的支持--有关一些细节,请参阅这篇博客文章。如果你不能升级,你可以使用一个稍老一点的2018年4月发布,它支持VS 2013。
D3DX9、D3DX10和D3DX11都与DirectX SDK (一般为每个MSDN )一起被否决。
https://stackoverflow.com/questions/50850182
复制相似问题