DirectX-11-framebuffer-capture (C++, keine Win32-oder D3DX)
Ich würde gerne erfassen den Inhalt meiner front-oder back-buffer Verwendung von DirectX 11 in ein array von bytes, die ich dann als textur oder als Quelle für eine Datei erstellen. Ich habe eine swap-Kette-setup, viel Rendern geschieht und den folgenden code so weit - die ich stellen Sie sicher, rufen Sie nach dem Aufruf zu Präsentieren.
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 alphas.
Ich würde normalerweise haben die Möglichkeit, GDI-interop verwenden BitBlt kopieren einer bitmap aus dem swap-Kette - jedoch habe ich Einschränkungen was bedeutet, dies ist nicht eine gültige Lösung.
Auch die D3DX-Bibliothek enthält Funktionen für die tun, bits dies ist auch aus der Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So. Ein wenig mehr Experimentierfreude offenbart sich das "problem". Durch getting die Beschreibung der framebuffer textur und verwenden, die als Grundlage zum erstellen der neuen textur das problem war gelöst...
Swap-Kette-Puffer können einfach gespeichert werden mit D3D11 wie unten gezeigt.
gekünstelt code-fragment:
Kopieren Sie die richtige Größe, verwenden Sie den folgenden code ein.