Direct3D11:翻转ID3D11Texture2D

时间:2017-10-19 07:00:16

标签: directx direct3d direct3d11

我执行Direct3D后台缓冲区的捕获。当我下载像素时,图像帧沿其垂直轴翻转。当复制资源或创建目标ID3D11Texture2D时,是否可以“告诉”D3D翻转帧?

我是这样做的:

我复制帧缓冲区的纹理是这样创建的:

    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上的像素缓冲区,例如循环中的反向复制等。复制的低延迟是高优先级。

更新:

我也试过这个:

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

导致框架内容空白。

2 个答案:

答案 0 :(得分:1)

使用D3D11_USAGE_DEAFULT创建纹理,CPUAccessFlags = 0且BindFlags = D3D11_BIND_SHADER_RESOURCE。 CopyResource交换链的后台缓冲区。使用D3D11_BIND_RENDER_TARGET创建另一个纹理。将其设置为渲染目标,设置像素着色器并使用第一个纹理绘制翻转的四边形。现在您应该能够将第二个纹理CopyResource复制到您现在使用的分段纹理。这应该比使用CPU复制翻转的图像数据更快。但是,这种解决方案在GPU上需要更多资源,并且可能很难在钩子中设置。

答案 1 :(得分: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