Ich möchte den Inhalt meiner Front-oder Back-Puffer mit DirectX 11 in einem Array von Bytes erfassen, die ich dann als Textur oder als Quelle für die Erstellung verwenden kann eine Datei. Ich habe ein Swap-Chain-Setup, viel Rendering passiert und den folgenden Code bis jetzt - den ich nach dem Aufruf von Present sicher anrufen werde.DirectX 11 Framebuffer-Capture (C++, kein Win32 oder D3DX)
ID3D11Texture2D* pSurface;
HRESULT hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pSurface));
if(pSurface)
{
const int width = static_cast<int>(m_window->Bounds.Width * m_dpi/96.0f);
const int height = static_cast<int>(m_window->Bounds.Height * m_dpi/96.0f);
unsigned int size = width * height;
if(m_captureData)
{
freeFramebufferData(m_captureData);
}
m_captureData = new unsigned char[ width * height * 4 ];
ID3D11Texture2D* pNewTexture = NULL;
D3D11_TEXTURE2D_DESC description =
{
width, height, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM,
{ 1, 0 }, // DXGI_SAMPLE_DESC
D3D11_USAGE_STAGING,
0, D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE, 0
};
HRESULT hr = m_d3dDevice->CreateTexture2D(&description, NULL, &pNewTexture);
if(pNewTexture)
{
m_d3dContext->CopyResource(pNewTexture, pSurface);
D3D11_MAPPED_SUBRESOURCE resource;
unsigned int subresource = D3D11CalcSubresource(0, 0, 0);
HRESULT hr = m_d3dContext->Map(pNewTexture, subresource, D3D11_MAP_READ, 0, &resource);
//resource.pData; // TEXTURE DATA IS HERE
const int pitch = width << 2;
const unsigned char* source = static_cast< const unsigned char* >(resource.pData);
unsigned char* dest = m_captureData;
for(int i = 0; i < height; ++i)
{
memcpy(dest, source, width * 4);
source += pitch;
dest += pitch;
}
m_captureSize = size;
m_captureWidth = width;
m_captureHeight = height;
return;
}
freeFramebufferData(m_captureData);
}
Es gibt mir immer schwarz mit Null-Alpha.
Normalerweise hätte ich die Option von GDI-Interop BitBlt zu verwenden, um eine Bitmap aus der Swap-Kette zu kopieren - allerdings habe ich Einschränkungen, was bedeutet, dass dies keine gültige Lösung ist.
Auch die D3DX-Bibliothek, die Funktionalität für Bits davon enthält, ist ebenfalls nicht in Frage.
das Problem ist, dass d3dx11 ist/war für WinRT Apps zum Zeitpunkt des Schreibens nicht verfügbar - selbst zu zitieren: „Auch die D3DX Bibliothek, die Funktionalität enthält für Bits, dies zu tun ist auch nicht in Frage. " – jheriko