DirectX 11 framebuffer de capture (C++, pas de Win32 ou D3DX)
Je voudrais saisir le contenu de mon front ou à l'arrière de la mémoire tampon à l'aide de DirectX 11 dans un tableau d'octets qui je peux ensuite l'utiliser comme une texture ou une source pour la création d'un fichier. J'ai un swap en chaîne de l'installation, beaucoup de rendu de passe et le code suivant jusqu'à présent - que j'assurez-vous d'appeler après l'appel à Présenter.
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 );
}
Il me donne toujours noir avec zéro alphas.
Je devrais normalement avoir la possibilité de GDI interop à utiliser BitBlt pour copier une image bitmap de la swap en chaîne toutefois, j'ai des restrictions qui signifie que ce n'est pas une solution valable.
Également la D3DX de la bibliothèque, qui contient une fonctionnalité pour faire des morceaux de ce est également hors de question.
OriginalL'auteur jheriko | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
. Un peu d'expérimentation plus poussée a révélé que le "problème". La description de la framebuffer texture et en les utilisant comme base pour créer la nouvelle texture, le problème a été résolu...
OriginalL'auteur jheriko
Swap de la chaîne d'tampons peuvent être facilement sauvegardées avec D3D11 comme indiqué ci-dessous.
artificiel fragment de code:
OriginalL'auteur Indy9000
Pour copier la bonne taille, utilisez le code ci-dessous.
OriginalL'auteur Yogan