DirectX 屏幕截图不起作用?
DirectX Screenshot Not Working?
我尝试使用 DirectX 截取屏幕截图,然后将其保存到文件中。
但是当下面的代码执行时,我得到一个完全黑色的 .png 大小(width/height)作为目标 DirectX 应用程序。我做错了什么?
HRESULT hr = S_OK;
ID3D11Texture2D* pBuffer;
ID3D11Texture2D* pBackBufferStaging = NULL;
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBuffer);
D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc(&td);
td.Usage = D3D11_USAGE_STAGING;
td.BindFlags = 0;
td.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE;
pDevice->CreateTexture2D(&td, NULL, &pBackBufferStaging);
pContext->CopyResource(pBackBufferStaging, pBuffer);
D3DX11SaveTextureToFile(pContext, pBackBufferStaging, D3DX11_IFF_PNG, L"D:\screen.png");
pBackBufferStaging->Release();
pBuffer->Release();
pSwapChain
是指向IDXGISwapChain
的指针,pDevice
是指向ID3D11Device
的指针,pContext
是指向ID3D11DeviceContext
的指针。它们都设置正确,但生成的屏幕截图仍然是黑色的。
更新#1
错误检查没有显示任何内容。所有功能均已成功执行。在 DirectX 11 "Hello world" 中,一切正常。我究竟做错了什么?我正在尝试截屏《坦克世界》游戏。
更新#2
在 DirectX 9 上,我的方法工作正常 - Heartstone 生成工作屏幕截图。
尝试将以下纹理描述传递给 CreateTexture2D:
D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc( &td);
td.BindFlags = 0;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.Usage = D3D11_USAGE_STAGING;
不要设置td.Format和td.MiscFlags。
您是要获取自己的应用程序还是桌面的屏幕截图?
如果它是另一个应用程序,你是如何获得它的交换链的?
如果您使用的是 Windows 8+,您可以使用 Desktop Duplication API
获取桌面的屏幕截图
顺便说一句,您可以在创建设备(D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain)时传递标志 D3D11_CREATE_DEVICE_DEBUG,然后检查调试输出。它可能会给你一些重要的线索。
我尝试使用 DirectX 截取屏幕截图,然后将其保存到文件中。 但是当下面的代码执行时,我得到一个完全黑色的 .png 大小(width/height)作为目标 DirectX 应用程序。我做错了什么?
HRESULT hr = S_OK;
ID3D11Texture2D* pBuffer;
ID3D11Texture2D* pBackBufferStaging = NULL;
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBuffer);
D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc(&td);
td.Usage = D3D11_USAGE_STAGING;
td.BindFlags = 0;
td.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE;
pDevice->CreateTexture2D(&td, NULL, &pBackBufferStaging);
pContext->CopyResource(pBackBufferStaging, pBuffer);
D3DX11SaveTextureToFile(pContext, pBackBufferStaging, D3DX11_IFF_PNG, L"D:\screen.png");
pBackBufferStaging->Release();
pBuffer->Release();
pSwapChain
是指向IDXGISwapChain
的指针,pDevice
是指向ID3D11Device
的指针,pContext
是指向ID3D11DeviceContext
的指针。它们都设置正确,但生成的屏幕截图仍然是黑色的。
更新#1
错误检查没有显示任何内容。所有功能均已成功执行。在 DirectX 11 "Hello world" 中,一切正常。我究竟做错了什么?我正在尝试截屏《坦克世界》游戏。
更新#2
在 DirectX 9 上,我的方法工作正常 - Heartstone 生成工作屏幕截图。
尝试将以下纹理描述传递给 CreateTexture2D:
D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc( &td);
td.BindFlags = 0;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.Usage = D3D11_USAGE_STAGING;
不要设置td.Format和td.MiscFlags。
您是要获取自己的应用程序还是桌面的屏幕截图? 如果它是另一个应用程序,你是如何获得它的交换链的? 如果您使用的是 Windows 8+,您可以使用 Desktop Duplication API
获取桌面的屏幕截图顺便说一句,您可以在创建设备(D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain)时传递标志 D3D11_CREATE_DEVICE_DEBUG,然后检查调试输出。它可能会给你一些重要的线索。