ID3D11Texture2D到ID2D1Bitmap,有可能吗?

时间:2014-03-13 15:22:20

标签: directx direct3d directx-11 direct2d dxgi

我正在开发一款游戏扩展程序,该游戏只会为插件开发人员打开HDC。

然而,我已经耗尽了GDI + / Direct2D绘图的可能性,这对我想要完成的任务来说足够快 - 图像效果(添加,混合,乘法混合等)。

我很清楚Direct2D提供的效果工具包需要平台更新(适用于Windows 7),而且根本不理想。

因此我只剩下Direct3D。 MSDN /谷歌搜索提供了很多方法来做D2D - > D3D,但ZERO显示了如何做D3D - > D2D。我知道有一种转换D3D的方法 - > D2D,那就是映射和复制像素数据,但这是非常低效的,因为(如果我是对的)它从GPU VRAM传输 - > CPU / RAM - > GPU VRAM。我可能只会将其作为最后一种选择......

或者,如果有人知道如何从D3D11中的RenderTarget中获取HDC以便我可以BitBlt,它也可能有效。

如果有人能帮忙解决这个问题,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

好吧我明白了。可能不是最有效的,但可以完成工作。 没有memcpy,bitblt(虽然在内存中的CreateBitmap内部可能有这些函数)。避免使用所有DXGI版本的垃圾。

    D3D11_TEXTURE2D_DESC td;
    m_backBufferTexture->GetDesc(&td);
    td.Usage = D3D11_USAGE_STAGING;
    td.BindFlags = 0;
    td.CPUAccessFlags = D3D11_CPU_ACCESS_READ;

    m_pDevice->CreateTexture2D( &td, NULL, &(m_pNewTexture) );
    m_pContext->CopyResource(m_pNewTexture, m_backBufferTexture);
    m_pNewTexture->QueryInterface(__uuidof(IDXGISurface), (void**)&m_NewTextDXGI);

    DXGI_MAPPED_RECT bitmap2Dmap;
    m_NewTextDXGI->Map(&bitmap2Dmap,DXGI_MAP_READ);

    D2D1_PIXEL_FORMAT desc2d;
    D2D1_BITMAP_PROPERTIES bmpprops;

    desc2d.format = DXGI_FORMAT_B8G8R8A8_UNORM;
    desc2d.alphaMode = D2D1_ALPHA_MODE_IGNORE; // Adapt to your needs.      

    bmpprops.dpiX = 96.0f;
    bmpprops.dpiY = 96.0f;
    bmpprops.pixelFormat = desc2d;


    D2D1_SIZE_U size = D2D1::SizeU(
    dim.x,
    dim.y
    ); // Adapt to your own size.

    pRT->CreateBitmap(size,(void*)bitmap2Dmap.pBits,bitmap2Dmap.Pitch,bmpprops,&m_pD2DBitmap);
    m_NewTextDXGI->Unmap();

答案 1 :(得分:0)

查看Surface Sharing Between Windows Graphics APIs

您可以专注于 Direct3D 10.1与Direct2D的设备共享

部分

答案 2 :(得分:0)

您可以使用ID2D1RenderTarget::CreateSharedBitmap创建与ID2D1Bitmap共享表面的IDXGISurface

引用:...您可以将IDXGISurface表面传递给CreateSharedBitmap方法,与Direct3D共享视频内存,并将Direct3D内容作为ID2D1Bitmap进行操作。

答案 3 :(得分:0)

这应该有效:

bool ConvertID3D11Texture2DToID2D1Bitmap(ID3D11DeviceContext* ctx, 
                                         ID3D11Texture2D* texture, 
                                         ID2D1Bitmap* bitmap)
{
      ComPtr<IDXGISurface> dxgiSurface;
      HRESULT hr = bitmap->GetSurface(&dxgiSurface);
      if (hr != S_OK)
           return false;
      ComPtr<ID3D11Resource> d3dResource;
      hr = dxgiSurface.As(&d3dResource);
      if (hr != S_OK)
           return false;
      ctx->CopyResource(d3dResource.Get(), texture);
}

所有工作都在GPU上完成。您应该确保纹理和位图具有相同的格式。