我執行Direct3D後臺緩衝區的捕獲。當我下載像素時,圖像幀沿着其垂直軸翻轉。當複製資源時,或者在創建目標時,可以「告訴」D3D翻轉該幀。Direct3D11:翻轉ID3D11Texture2D
這是我如何做到這一點:
到我複製幀緩存紋理創建這樣的:
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);
然後每幀我做的:
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:我沒有渲染管道的控制權。我用這段代碼掛鉤了一個外部應用程序。 此外,我不想弄亂CPU上的像素緩衝區,就像循環中的反向複製等。副本的低延遲是高優先級。
UPDATE:
我也試過這樣:
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);
這將導致框架是從它的內容爲空。
不要忘記檢查那些返回非''void''的函數的''HRESULT''值。您目前假設它始終有效。使用''SUCCEEDED'',''FAILED''或類似[ThrowIfFiled](https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed)。 –
@ChuckWalbourn實際上一直這樣做..爲簡單起見,在這裏刪除。 –
基於多鉤子一箇舊項目的例子:https://github.com/headmax/Cplus/blob/master/Projet4/Main.cpp不知道如果真的幫助你... – 2017-10-19 07:20:54