Ich führe eine Erfassung von Direct3D-Back-Buffer. Wenn ich die Pixel herunterlade, wird der Bildrahmen um seine vertikale Achse gedreht. Ist es möglich, D3D mitzuteilen, dass der Rahmen beim Kopieren der Ressource oder beim Erstellen des Ziels ID3D11Texture2D
gedreht werden soll?Direct3D11: Spiegeln ID3D11Texture2D
Hier ist, wie ich es tun:
Die Textur, in die ich den Frame-Buffer kopieren wie folgt erstellt:
D3D11_TEXTURE2D_DESC description =
{
desc.BufferDesc.Width, desc.BufferDesc.Height, 1, 1,
DXGI_FORMAT_R8G8B8A8_UNORM,
{ 1, 0 }, // DXGI_SAMPLE_DESC
D3D11_USAGE_STAGING,//transder from GPU to CPU
0, D3D11_CPU_ACCESS_READ, 0
};
D3D11_SUBRESOURCE_DATA data = { buffer, desc.BufferDesc.Width * PIXEL_SIZE, 0 };
device->CreateTexture2D(&description, &data, &pNewTexture);
Dann auf jeden Frame ich tun:
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pSurface));
pContext->CopyResource(pNewTexture, pSurface);
D3D11_MAPPED_SUBRESOURCE resource;
pContext->Map(pNewTexture, 0, D3D11_MAP_READ , 0, &resource);
//reading from resource.pData
//...
PS: Ich habe keine Kontrolle über die Rendering-Pipeline. Ich hänge eine externe App mit diesem Code an. Ich möchte auch nicht mit dem Pixel-Puffer auf der CPU, wie Reverse-Kopie in einer Schleife, etc .. Die niedrige Latenz der Kopie hat hohe Priorität.
UPDATE:
ich dies auch versucht:
D3D11_BOX box;
box.left = 0;
box.right = desc.BufferDesc.Width;
box.top = desc.BufferDesc.Height;
box.bottom = 0;
box.front = 0;
box.back = 1;
pContext->CopySubresourceRegion(pNewTexture, 0, 0, 0, 0, pSurface, 0, &box);
, die den Rahmen verursacht von seinem Inhalt leer zu sein.
Vergessen Sie nicht, die '' HRESULT'' Werte für diejenigen Funktionen zu überprüfen, die nicht ''void'' zurückgeben. Sie gehen derzeit davon aus, dass es immer funktioniert. Verwenden Sie '' SUCCEEDED'', '' FAILED'' oder etwas wie [ThrowIfFailed] (https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed). –
@ChuckWalbourn Eigentlich macht es den ganzen Weg..Entschieden hier wegen der Einfachheit. –
Ein Beispiel basierend auf Multi-Hooks ein altes Projekt: https://github.com/headmax/Cplus/blob/master/Projet4/Main.cpp dunno wenn Sie wirklich helfen ... –