Как сделать скриншот с DirectX 11?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как сделать скриншот с DirectX 11?

Сообщение Anonymous »

Я пишу плагин для игры DX11, и мне нужно сделать снимок экрана и сохранить его в файл. Я нашел несколько фрагментов кода, использующих функцию D3DX11SaveTextureToFile, но мне просто не удалось заставить ее работать. Вот что у меня есть на данный момент: (для простоты удалена проверка ошибок и несвязанный код)

Код: Выделить всё

void screenshot(IDXGISwapChain *pSwapChain)
{
ID3D11Device *pDevice;
pSwapChain->GetDevice(__uuidof(ID3D11Device), reinterpret_cast(&pDevice));

ID3D11DeviceContext *pContext;
pDevice->GetImmediateContext(&pContext);

ID3D11Texture2D *pBackBuffer;
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast(&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 не поддерживает его, если я правильно прочитал его файл readme.

РЕДАКТИРОВАТЬ

DirectXTK/DirectXTex работал безупречно.

Подробнее здесь: https://stackoverflow.com/questions/508 ... directx-11
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»