Direct3Dバックバッファのキャプチャを実行します。私がピクセルをダウンロードするとき、イメージフレームは垂直軸に沿って反転されます。リソースをコピーするとき、またはターゲットを作成するときにD3Dにフレームを反転させることを「指示する」ことが可能ですか?ID3D11Texture2D
?ここでDirect3D11:Flipping 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);
。
''無効 ''を返す関数の '' HRESULT''値をチェックすることを忘れないでください。あなたは現在、それは常に動作すると仮定しています。 '' SUCCEEDED''、 '' FAILED''など[ThrowIfFailed](https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed)を使用してください。 –
@ChuckWalbourn実際にすべてのことをやっています。簡単にするためにここに忘れました。 –
古いプロジェクトのマルチフックに基づく例:https://github.com/headmax/Cplus/blob/master/Projet4/Main.cpp本当に助けてくれる人なら... –