2017-10-19 4 views
0

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); 

+0

''無効 ''を返す関数の '' HRESULT''値をチェックすることを忘れないでください。あなたは現在、それは常に動作すると仮定しています。 '' SUCCEEDED''、 '' FAILED''など[ThrowIfFailed](https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed)を使用してください。 –

+0

@ChuckWalbourn実際にすべてのことをやっています。簡単にするためにここに忘れました。 –

+0

古いプロジェクトのマルチフックに基づく例:https://github.com/headmax/Cplus/blob/master/Projet4/Main.cpp本当に助けてくれる人なら... –

答えて

0

すべてのDirect3Dのマッピングされたリソースは、これだけのコピーを逆に、走査線ごとの走査線を処理されるべきである:

auto ptr = reinterpret_cast<const uint8_t>(resource.pData) 
      + (desc.BufferDesc.Height - 1) * resource.RowPitch; 

for(unsigned int y = 0; y < desc.BufferDesc.Height; ++y) 
{ 
    // do something with the data in ptr 
    // which is desc.BufferDesc.Width * BytesPerPixel(desc.Format) bytes 
    // i.e. DXGI_FORMAT_R8G8B8A8_UNORM would be desc.BufferDesc.Width * 4 
    ptr -= resource.RowPitch; 
} 

Direct3Dのリソースでの作業の多くの例については、DirectXTexを参照してください。

+0

オプションはありません。私はコピーが非常に高速である必要があります。私はドライバーやGPU側でフリップをする方法を模索しています。私はそれを私の質問で強調します。 –

+0

あなたはVsを反転させたテクスチャにクワッドをレンダリングすることができます... –

0

CPUAccessFlags = 0およびBindFlags = D3D11_BIND_SHADER_RESOURCEのD3D11_USAGE_DEAFULTでテクスチャを作成します。 SwapchainのバックバッファをCopyResourceにコピーします。 D3D11_BIND_RENDER_TARGETで別のテクスチャを作成します。レンダーターゲットとして設定し、ピクセルシェーダを設定し、最初のテクスチャを使用してフリップしたクワッドを描画します。これで、今使用しているステージングテクスチャに2番目のテクスチャをCopyResourceすることができます。これは、CPUを使用して反転されたイメージデータをコピーするよりも速くなければなりません。しかし、このソリューションはGPU上でより多くのリソースを必要とし、フックでセットアップするのが難しいかもしれません。

関連する問題